博客 / 詳情

返回

四、裝飾者模式

一、模式定義

  在不改變原有對象的前提下(不改變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

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.