設(shè)計(jì)模式學(xué)習(xí)筆記(六)—Decorator裝飾模式
Posted on 2007-11-28 20:31 flustar 閱讀(1192) 評(píng)論(0) 編輯 收藏 所屬分類: Design Patterns《設(shè)計(jì)模式》一書對(duì)Decorator是這樣描述的:
動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就增加功能來說,Decorator模式比生成子類更為靈活。
也就是說:動(dòng)態(tài)地給對(duì)象添加一些額外的功能。它的工作原理是:創(chuàng)建一個(gè)始于Decorator對(duì)象(負(fù)責(zé)新功能的對(duì)象)終止于原對(duì)象的一個(gè)對(duì)象的“鏈”。例如,我們要為超市的收銀臺(tái)設(shè)計(jì)一個(gè)打印票據(jù)的程序,有的需要打印票據(jù)的頭信息,有的需要打印票據(jù)的頁腳信息,有的只需要打印票據(jù)的內(nèi)容。如果針對(duì)每一種情況都修改一次程序,勢(shì)必會(huì)很麻煩。這時(shí)我們可以考慮使用Decorator模式。其結(jié)構(gòu)類圖如下:
代碼如下:
abstract class Component{
abstract public void printTicket();
}
class SalesTicket extends Component{
public void printTicket() {
System.out.println("打印出salesTicket的內(nèi)容");
}
}
abstract class TicketDecorator extends Component{
private Component myTrailer;
public TicketDecorator(Component myComponent){
myTrailer=myComponent;
}
public void callTrailer(){
if(myTrailer!=null)
myTrailer.printTicket();
}
}
class Header extends TicketDecorator{
public Header(Component myComponent){
super(myComponent);
}
public void printTicket(){
System.out.println("打印salesTicket的頭信息");
super.callTrailer();
}
}
class Footer extends TicketDecorator{
public Footer(Component myComponent){
super(myComponent);
}
public void printTicket(){
super.callTrailer();
System.out.println("打印salesTicket的頁腳信息");
}
}
public class Client {
public static void main(String[] args) {
System.out.println("====================================");
new Header(new Footer(new SalesTicket())).printTicket();
System.out.println("====================================");
new Footer(new Header(new SalesTicket())).printTicket();
System.out.println("====================================");
}
}
輸出結(jié)果如下:
====================================
打印salesTicket的頭信息
打印出salesTicket的內(nèi)容
打印salesTicket的頁腳信息
====================================
打印salesTicket的頭信息
打印出salesTicket的內(nèi)容
打印salesTicket的頁腳信息
====================================
從這個(gè)例子我們可以看出,Decorator模式把問題分為兩部分:
1) 如何實(shí)現(xiàn)提供新功能的對(duì)象。
2) 如何為每種特殊情況組織對(duì)象。
這樣能夠?qū)ecorator對(duì)象的實(shí)現(xiàn)與決定如何使用Decorator的對(duì)象分離開來,從而提高了內(nèi)聚性,因?yàn)槊總€(gè)Decorator對(duì)象只用關(guān)心自己添加的功能,無需關(guān)心自己是如何被加入到對(duì)象鏈中。還可以任意地重排Decorator的順序,無需改變其任何代碼。
小結(jié):Decorator模式的適用場合是,各種可選的功能在另一個(gè)肯定要執(zhí)行的功能之前或之后執(zhí)行。