設計模式之簡單理解裝飾器模式與運用

  • 2019 年 11 月 3 日
  • 筆記

1.什麼是裝飾器模式

​ 裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構。這種類型的設計模式屬於結構型模式,它是作為現有的類的一個包裝。

​ 這種模式創建了一個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。

KXaGjK.png

2、裝飾器模式的重要組成部分

①裝飾器模式特點:

(1) 裝飾對象和真實對象有相同的介面。這樣客戶端對象就能以和真實對象相同的方式和裝飾對象交互。

(2) 裝飾對象包含一個真實對象的引用(reference)

(3) 裝飾對象接受所有來自客戶端的請求。它把這些請求轉發給真實的對象。

(4) 裝飾對象可以在轉發這些請求以前或以後增加一些附加功能。這樣就確保了在運行時,不用修改給定對象的結構就可以在外部增加附加的功能。在面向對象的設計中,通常是通過繼承來實現對給定類的功能擴展。

②裝飾器模式由組件和裝飾者組成:
  • 抽象組件(Component):需要裝飾的抽象對象。
  • 具體組件(ConcreteComponent):是我們需要裝飾的對象。
  • 抽象裝飾類(Decorator):內含指向抽象組件的引用及裝飾者共有的方法。
  • 具體裝飾類(ConcreteDecorator):被裝飾的對象。

3.裝飾器模式的具體實現

生活中的裝飾器小例子:

​ 公路上的汽車川流不息,我們的生活總是繁忙不停。終於有了一個假期.我們開著汽車出去玩,但是正如世界上沒有同樣自己的一樣,總想找點不一樣的感覺。於是我們買了油漆,照著圖案給車來個帥氣的賽車紋理,終於與眾不同了,我們開車去玩吧!

package jiagouxiancheng.month_11.day1103.zhuangshiqi;      interface Car {      void run();  }      class BMWCar implements Car {      @Override      public void run() {          System.out.println("寶馬開動...");      }  }    class BenzCar implements Car {      @Override      public void run() {          System.out.println("Benz開動...");      }  }    /**   * 賽車油漆塗料   */  class PaintDecorator implements Car {        protected Car car;        public PaintDecorator(Car car) {          this.car = car;      }        @Override      public void run() {          car.run();      }    }    class CoolPanintDecorator extends PaintDecorator {        public CoolPanintDecorator(Car car) {          super(car);      }        @Override      public void run() {          cooolPanint();          car.run();      }        private void cooolPanint() {          System.out.print("刷上帥氣的賽車圖案的油漆->");      }      }    /**   * 給車來個酷酷的造型   */  public class DriveCar {        public static void main(String[] args) {            System.out.println("公路上的車川流不息...");          Car bmwCar = new BMWCar();          Car benzCar = new BenzCar();          bmwCar.run();          benzCar.run();          System.out.println("這次我們先給車來個酷酷的造型!");          Car car = new CoolPanintDecorator(benzCar);          car.run();        }  }
輸出結果:
公路上的車川流不息...  寶馬開動...  Benz開動...  這次我們先給車來個酷酷的造型!  刷上帥氣的賽車圖案的油漆->Benz開動...
4.總結

①優點:裝飾類和被裝飾類可以獨立發展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態擴展一個實現類的功能。

②缺點:多層裝飾比較複雜。

③使用場景:1、擴展一個類的功能。 2、動態增加功能,動態撤銷。