天天看點

設計模式總結之Decorator Pattern(裝飾者模式)目錄 Decorator Pattern(裝飾者模式)

目錄

  • 設計模式分類

建立型設計模式:

  • Singleton Pattern(單例模式)   
  • Prototype Pattern(原型模式)
  • Factory Method Pattern(工廠方法模式)   
  • Abstract Factory Pattern(抽象工廠模式)
  • Builder Pattern(建造者模式)

結構型設計模式:

  • Adapter Pattern(擴充卡模式)   
  • Bridge Pattern(橋接模式)
  • Composite Pattern(組合模式)
  • Decorator Pattern(裝飾者模式)
  • Façade Pattern(外觀模式)
  • Flyweight Pattern(享元模式)
  • Proxy Pattern(代理模式)   

行為型設計模式:

  • Chain of Responsibility Pattern(職責鍊模式)
  • Command Pattern(指令模式)
  • Interpreter Pattern(解釋器模式)   
  • Iterator Pattern(疊代器模式)
  • Mediator Pattern(中介者模式)
  • Memento Pattern(備忘錄模式)
  • Observer Pattern(觀察者模式)
  • State Pattern(狀态模式)
  • Strategy Pattern(政策模式)
  • Template Method Pattern(模闆方法模式)
  • Visitor Pattern(通路者模式)

Decorator Pattern(裝飾者模式)

Decorator Pattern叫裝飾模式,或裝飾者模式,以前叫包裝器模式(Wrapper,GoF在92-93年由Wrapper改為Decorator)。

裝飾模式是在不必改變原類檔案和使用繼承的情況下,動态地擴充一個對象的功能。它是通過建立一個包裝對象,也就是裝飾來包裹真實的對象。

Decorator模式的工作原理是:可以建立始于Decorator對象(負責新的功能的對象)終于原對象的一個對象“鍊”。

設計模式總結之Decorator Pattern(裝飾者模式)目錄 Decorator Pattern(裝飾者模式)

裝飾者模式隐含的是通過一條條裝飾鍊去實作具體對象,每一條裝飾鍊都始于一個Componet對象,每個裝飾者對象後面緊跟着另一個裝飾者對象,而對象鍊終于ConcreteComponet對象。 

意圖

動态地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式相比生成子類更為靈活。

适用性

1. 需要擴充一個類的功能,或給一個類添加附加職責。

2. 需要動态的給一個對象添加功能,這些功能可以再動态的撤銷。

3. 需要增加由一些基本功能的排列組合而産生的非常大量的功能,進而使繼承關系變的不現實。

4. 當不能采用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴充,為支援每一種組合将産生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隐藏,或類定義不能用于生成子類。

結構:

設計模式總結之Decorator Pattern(裝飾者模式)目錄 Decorator Pattern(裝飾者模式)

在裝飾模式中的各個角色有:

  (1)抽象構件(Component)角色:給出一個抽象接口,以規範準備接收附加責任的對象。

  (2)具體構件(Concrete Component)角色:定義一個将要接收附加責任的類。

  (3)裝飾(Decorator)角色:持有一個構件(Component)對象的執行個體,并實作一個與抽象構件接口一緻的接口。

  (4)具體裝飾(Concrete Decorator)角色:負責給構件對象添加上附加的責任。

例子

設計模式總結之Decorator Pattern(裝飾者模式)目錄 Decorator Pattern(裝飾者模式)
設計模式總結之Decorator Pattern(裝飾者模式)目錄 Decorator Pattern(裝飾者模式)
空桌子,沒裝飾 裝飾後的桌子,有桌布,有花
設計模式總結之Decorator Pattern(裝飾者模式)目錄 Decorator Pattern(裝飾者模式)
設計模式總結之Decorator Pattern(裝飾者模式)目錄 Decorator Pattern(裝飾者模式)

另:

JAVA中IO流的設計就大量運用了裝飾模式,如:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("..")));

繼續閱讀