又稱包裝(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
以對客戶端透明(客戶端并不會覺得對象在裝飾前后有什么不同,老孫就是老孫!^_^)的方式擴展對象的功能,是繼承關系的一個替代方案。
何時使用?
1. 需要擴展一個類的功能,或給一個類增加附加責任。
2. 需要動態地給一個對象增加功能,這些功能可以再動態地撤銷。
3. 需要增加由一些基本功能的排列組合而產生的非常大量的功能,從而使繼承關系變得不現實。
優點:
1. 可以提供比繼承更多的靈活性。
2. 通過使用不同的具體裝飾類以及這些裝飾類的排列組合,設計師可以創造出很多不同行為的組合。
缺點:
1. 會產生比使用繼承關系更多的對象,會使得查錯變得困難。
類圖示意:

1. com.cleversoft.designpatterns.decorator.Widget.java:







2. com.cleversoft.designpatterns.decorator.TextField.java:




















3. com.cleversoft.designpatterns.decorator.Decorator.java:



















4. com.cleversoft.designpatterns.decorator.BorderDecorator.java:



















5. com.cleversoft.designpatterns.decorator.ScrollDecorator.java:




















6. com.cleversoft.designpatterns.decorator.Client.java:


















參考資料:
1. 《Java與模式》
2. Design Patterns With Code
|
|
歡迎大家訪問我的個人網站 萌萌的IT人