「手写设计模式」装饰器模式

313 阅读1分钟

理解名称

装饰器模式(Decorator Pattern)属于结构型模式,允许向一个现有的对象添加新的功能,同时又不改变其结构。 该模式强调一个思想:组合优于继承

作用

  • 解决继承关系过于复杂的问题,通过组合来替代继承
  • 给原始类添加增强功能

适用场景

需要给原始类添加增强功能,又不能通过继承的方式避免子类数量爆炸

装饰器模式和代理类模式对比:代理模式中,代理类附加的是跟原始类无关的功能,而在装饰器模式中,装饰器类附加的是跟原始类相关的增强功能。

代码示例

需求:为形状类新增一个功能,能够画上不同的颜色,同时又不改变形状类。

定义形状接口:

public interface Shape {
   void draw();
}

创建实现接口的实体类

// 矩形
public class Rectangle implements Shape {
   @Override
   public void draw() {
      System.out.println("Shape: Rectangle");
   }
}

// 圆形
public class Circle implements Shape {
 
   @Override
   public void draw() {
      System.out.println("Shape: Circle");
   }
}

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

public class ColoredShapeDecorator implements Shape {
   private Shape decoratedShape;
   private String color;
   
   public ColoredShapeDecorator(Shape decoratedShape, String color) {
      this.decoratedShape = decoratedShape;
      this.color = color;
   }
 
   @Override
   public void draw() {
      decoratedShape.draw();         
      drawColor();
   }
 
   public void setColor(String color) {
       this.color = color;
   }
   
   private void drawColor(){
      System.out.println("Shape's Color:" + color;);
   }
}

使用示例

public class DecoratorPatternDemo {
   public static void main(String[] args) {
 
      Shape circle = new Circle();
      ColoredShapeDecorator redCircle = new ColoredShapeDecorator(new Circle(), "red");
      System.out.println("Circle with no color");
      circle.draw();
 
      System.out.println("Red Circle");
      redCircle.draw();
   }
}

业界经典实现

  • JAVA IO