四、装饰者模式

一、模式定义

  在不改变原有对象的前提下(不改变ConcreteComponent情况下),给原有对象扩展功能(利用ConcreteDecorator扩展功能,在ConcreteDecorator中注入ConcreteComponent)。如下所示:
clipboard

二、应用场景

  扩展一个类的功能,或者给一个类添加一些附加职责

三、优点:

①、灵活改变组合;
②、符合开闭原则;

四、装饰者模式的实现方式

4.1、方式1
package decorator;

public class DecoratorDesignPattern {
   public static void main(String[] args) {
      Decorator decoratorA = new ConcreteDecoratorA(new ConcreteComponent());
      decoratorA.operation();

      Decorator decoratorB = new ConcreteDecoratorB(new ConcreteDecoratorA(new ConcreteComponent()));
      decoratorB.operation();
   }
}

interface Component{
   void operation();
}

class ConcreteComponent implements Component{

   @Override
   public void operation() {
      System.out.println("拍照...\n");
   }
}

abstract class Decorator implements Component{
   Component component;

   public Decorator(Component component) {
      this.component = component;
   }
}

class ConcreteDecoratorA extends Decorator{

   public ConcreteDecoratorA(Component component) {
      super(component);
   }

   @Override
   public void operation() {
      System.out.println("添加美颜....");
      component.operation();
   }
}

class ConcreteDecoratorB extends Decorator{
   public ConcreteDecoratorB(Component component) {
      super(component);
   }

   @Override
   public void operation() {
      System.out.println("添加滤镜");
      component.operation();
   }
}

上面代码的运行结果如下:
clipboard

4.2、方式2
package decorator;

public class DecoratorPattern {
   public static void main(String[] args) {
      Circle circle = new Circle();
      RedShapeDecorator redCircle = new RedShapeDecorator(circle);
      Rectangle rectangle = new Rectangle();
      RedShapeDecorator redRectangle = new RedShapeDecorator(rectangle);

      System.out.println("Circle with normal border");
      circle.draw();

      System.out.println("\nCircle of red border");
      redCircle.draw();

      System.out.println("\nRectangle of red border");
      redRectangle.draw();

   }
}


interface Shape {
   void draw();
}

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

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


abstract class ShapeDecorator implements Shape {
   public Shape decoratedShape;

   public ShapeDecorator(Shape decoratorShape) {
      this.decoratedShape = decoratorShape;
   }

   @Override
   public void draw() {
      decoratedShape.draw();
   }
}

class RedShapeDecorator extends ShapeDecorator {

   public RedShapeDecorator(Shape decoratorShape) {
      super(decoratorShape);
   }

   @Override
   public void draw() {
      decoratedShape.draw();
      setRedBorder(decoratedShape);

   }

   private void setRedBorder(Shape decoratedShape){
      System.out.println("Border Color: Red");
   }
}

上面代码的运行结果如下:
clipboard

五、装饰者模式的应用

  Java IO 库采用了装饰器模式(Decorator Pattern)和适配器模式(Adapter Pattern)的组合设计模式,其中InputStream是装饰器模式中顶层的抽象类,FilterInputStream是装饰器基类,BufferedInputStream是带有缓冲区的装饰器类,ObjectInputStream是可以读取对象的装饰器类,SequenceInputStream是可以顺序读取多个输入Stream的装饰器类,FileInputStream、ByteArrayInputStream则是被装饰的类。 这些类的UML图,如下所示:
image

posted @ 2026-02-11 21:57  Carey_ccl  阅读(138)  评论(0)    收藏  举报