《設(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í)行。

           

          posts - 146, comments - 143, trackbacks - 0, articles - 0

          Copyright © flustar

          主站蜘蛛池模板: 鄂尔多斯市| 岱山县| 商洛市| 新沂市| 贵州省| 个旧市| 景洪市| 昭通市| 武川县| 马鞍山市| 武平县| 屏南县| 高淳县| 伽师县| 菏泽市| 台北市| 应城市| 疏附县| 铜陵市| 墨脱县| 宣武区| 莱阳市| 博罗县| 贡山| 朝阳市| 通州市| 湖南省| 大冶市| 普兰县| 塔城市| 本溪| 广宗县| 澎湖县| 富源县| 马山县| 宁化县| 文水县| 苗栗市| 延津县| 建昌县| 洱源县|