?
GoF : 動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator(裝飾)模式相比生成子類更為靈活。
在系統開發的過程中,我們希望給某個對象而不是整個類添加一些功能。例如:我們要做一扇門,現在為了能將門做的美觀和安全需要給門加上鎖和把手,還可能給門加上窗戶和雕花。這里我們把這些要添加的東西叫做門的屬性。
使用繼承機制是添加功能的一種有效途徑,從其他類繼承過來的屬性可以被多個子類的實例所使用。但這種方式不夠靈活,因為如果我們的門做工過細價錢也就高,有些顧客可能不需要這樣的門。這樣我們就需要靈活添加門的屬性。
一種較為靈活的方式是使用Decorator模式。Decorator模式的效果是:讓我們可以創建以decorator對象—負責新的功能的對象—開始的一條對象“鏈”,并結束于最初的對象。
Decorator 模式幫助我們將問題分解為兩個部分:
l??????? 如何實現提供新功能的對象。
l??????? 如何為每種特定情況將對象組織起來。
一個實際的例子是Java的I/O類就廣泛使用了Decorator模式,大家有興趣可以去研究一下。直到現在我還沒有研究過。
裝飾模式包括如下角色:
l??????? 抽象構件(Component):給出一個抽象接口,以規范準備接收附加責任的對象。
l??????? 具體構件(Concrete Component):定義一個將要接收附加責任的類。
l??????? 裝飾(Decorator):持有一個構件對象的實例,并定義一個與抽象構件接口一致的接口。
l??????? 具體裝飾(Concrete Decorator):負責給構件對象“貼上”附加的責任。
下面是Decorator模式的UML圖:
下面是事例代碼:
package Decorator;
/*
?* 具體的一個門
?*/
public class Door extends Component
{
?????? public void sampleOperation()
?????? {
????????????? System.out.println("Build a door!");
?????? }//end sampleOperation()
}//end class Door
?* 用來裝飾門的把手
public class Knob extends Decorator
?????? public Knob(Component component)
????????????? super(component);
?????? }//end ConcreteDecorator2(...)
??? public void sampleOperation()
??? {
???????? super.sampleOperation ();
???????? System.out.println("Add an Knob( 把手 )");
??? }//end sampleOperation()
}//END CLASS Knob
?* 用來裝飾門的門鎖
public class Lock extends Decorator
?????? public Lock(Component component)
?????? }//end ConcreteDecorator1(...)
????????????? super.sampleOperation ();
????????????? System.out.println("Add a lock( 鎖 )");
}//end class Lock
下面是執行結果:
Decorator Pattern!
Build a door!
Add a lock( 鎖 )Add an Knob(把手)