橘子味的心
标题:Java装饰模式

装饰器模式允许用户向现有对象添加新功能而不改变其结构。 这种类型的设计模式属于结构模式,因为此模式充当现有类的包装器。

此模式创建一个装饰器类,它包装原始类并提供附加功能,保持类方法签名完整。

我们通过以下示例展示装饰器模式的使用,其中我们将用一些颜色装饰形状而不改变形状类。

实现实例

在这个实例中,将创建一个Shape接口和实现Shape接口的具体类。然后再创建一个抽象装饰器类-ShapeDecorator,实现Shape接口并使用Shape对象作为其实例变量。

这里的RedShapeDecorator是实现ShapeDecorator的具体类。

DecoratorPatternDemo这是一个演示类,将使用RedShapeDecorator来装饰Shape对象。装饰模式示例的结构如下所示 -

第1步

创建一个简单的接口。
Shape.java

  1. public interface Shape {
  2. void draw();
  3. }
  4. Java

第2步

创建两个实现相同接口的具体类。
Rectangle.java

  1. public class Rectangle implements Shape {
  2.  
  3. @Override
  4. public void draw() {
  5. System.out.println("Shape: Rectangle");
  6. }
  7. }
  8. Java

Circle.java

  1. public class Circle implements Shape {
  2.  
  3. @Override
  4. public void draw() {
  5. System.out.println("Shape: Circle");
  6. }
  7. }
  8. Java

第3步

创建实现Shape接口的抽象装饰器类。

ShapeDecorator.java

  1. public abstract class ShapeDecorator implements Shape {
  2. protected Shape decoratedShape;
  3.  
  4. public ShapeDecorator(Shape decoratedShape){
  5. this.decoratedShape = decoratedShape;
  6. }
  7.  
  8. public void draw(){
  9. decoratedShape.draw();
  10. }
  11. }
  12. Java

第4步

创建扩展ShapeDecorator类的具体装饰器类。
RedShapeDecorator.java

  1. public class RedShapeDecorator extends ShapeDecorator {
  2.  
  3. public RedShapeDecorator(Shape decoratedShape) {
  4. super(decoratedShape);
  5. }
  6.  
  7. @Override
  8. public void draw() {
  9. decoratedShape.draw();
  10. setRedBorder(decoratedShape);
  11. }
  12.  
  13. private void setRedBorder(Shape decoratedShape){
  14. System.out.println("Border Color: Red");
  15. }
  16. }
  17. Java

第5步

使用RedShapeDecorator装饰Shape对象。

DecoratorPatternDemo.java

  1. public class DecoratorPatternDemo {
  2. public static void main(String[] args) {
  3.  
  4. Shape circle = new Circle();
  5.  
  6. Shape redCircle = new RedShapeDecorator(new Circle());
  7.  
  8. Shape redRectangle = new RedShapeDecorator(new Rectangle());
  9. System.out.println("Circle with normal border");
  10. circle.draw();
  11.  
  12. System.out.println("\nCircle of red border");
  13. redCircle.draw();
  14.  
  15. System.out.println("\nRectangle of red border");
  16. redRectangle.draw();
  17. }
  18. }
  19. Java

第6步

验证输出,执行上面的代码得到以下结果 -

  1. Circle with normal border
  2. Shape: Circle
  3.  
  4. Circle of red border
  5. Shape: Circle
  6. Border Color: Red
  7.  
  8. Rectangle of red border
  9. Shape: Rectangle
  10. Border Color: Red
  11. Java