又稱包裝(wrapper)模式。
以對客戶端透明(客戶端并不會覺得對象在裝飾前后有什么不同,老孫就是老孫!^_^)的方式擴展對象的功能,是繼承關系的一個替代方案。

何時使用?
1. 需要擴展一個類的功能,或給一個類增加附加責任。
2. 需要動態地給一個對象增加功能,這些功能可以再動態地撤銷。
3. 需要增加由一些基本功能的排列組合而產生的非常大量的功能,從而使繼承關系變得不現實。

優點:
1. 可以提供比繼承更多的靈活性。
2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。

缺點:
1. 會產生比使用繼承關系更多的對象,會使得查錯變得困難。

類圖示意:



















1. com.cleversoft.designpatterns.decorator.Widget.java:
package?com.cleversoft.designpatterns.decorator;

public?interface?Widget?{
????
void?draw();
}

2. com.cleversoft.designpatterns.decorator.TextField.java:
package?com.cleversoft.designpatterns.decorator;

public?class?TextField?implements?Widget?{
????
private?int?width,?height;

????
public?TextField(int?width,?int?height)?{
????????
this.width?=?width;
????????
this.height?=?height;
????}


????
public?void?draw()?{
????????System.out.println(
"TextField:?"?+?width?+?",?"?+?height);
????}

}

3. com.cleversoft.designpatterns.decorator.Decorator.java:
package?com.cleversoft.designpatterns.decorator;

public?abstract?class?Decorator?implements?Widget?{
????
private?Widget?wid;

????
public?Decorator(Widget?wid)?{
????????
this.wid?=?wid;
????}


????
public?void?draw()?{
????????wid.draw();
????}

}

4. com.cleversoft.designpatterns.decorator.BorderDecorator.java:
package?com.cleversoft.designpatterns.decorator;

public?class?BorderDecorator?extends?Decorator?{

????
public?BorderDecorator(Widget?wid)?{
????????
super(wid);
????}


????
public?void?draw()?{
????????
super.draw();
????????System.out.println(
"???BorderDecorator");
????}

}

5. com.cleversoft.designpatterns.decorator.ScrollDecorator.java:
package?com.cleversoft.designpatterns.decorator;

public?class?ScrollDecorator?extends?Decorator?{

????
public?ScrollDecorator(Widget?wid)?{
????????
super(wid);
????}


????
public?void?draw()?{
????????
super.draw();
????????System.out.println(
"???ScrollDecorator");
????}


}

6. com.cleversoft.designpatterns.decorator.Client.java:
package?com.cleversoft.designpatterns.decorator;

public?class?Client?{

????
public?static?void?main(String[]?args)?{
????????
//?Widget?w?=?new?TextField(20,?10);
????????
//?Widget?b?=?new?BorderDecorator(w);
????????
//?b.draw();

????????Widget?w?
=?new?BorderDecorator(new?ScrollDecorator(
????????????????
new?TextField(50,?20)));
????????w.draw();
????}

}


參考資料:
1. 《Java與模式》
2. Design Patterns With Code

歡迎大家訪問我的個人網站 萌萌的IT人