<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    設計模式學習筆記(六)—Decorator裝飾模式

    Posted on 2007-11-28 20:31 flustar 閱讀(1188) 評論(0)  編輯  收藏 所屬分類: Design Patterns

    《設計模式》一書對Decorator是這樣描述的:
     動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator模式比生成子類更為靈活。
    也就是說:動態地給對象添加一些額外的功能。它的工作原理是:創建一個始于Decorator對象(負責新功能的對象)終止于原對象的一個對象的“鏈”。例如,我們要為超市的收銀臺設計一個打印票據的程序,有的需要打印票據的頭信息,有的需要打印票據的頁腳信息,有的只需要打印票據的內容。如果針對每一種情況都修改一次程序,勢必會很麻煩。這時我們可以考慮使用Decorator模式。其結構類圖如下:
     

    代碼如下:
    abstract class Component{
     abstract public void printTicket();
    }
    class SalesTicket extends Component{
     public void printTicket() {
      System.out.println("打印出salesTicket的內容");
     }
    }
    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("====================================");
     }

    }
    輸出結果如下:
    ====================================
    打印salesTicket的頭信息
    打印出salesTicket的內容
    打印salesTicket的頁腳信息
    ====================================
    打印salesTicket的頭信息
    打印出salesTicket的內容
    打印salesTicket的頁腳信息
    ====================================
    從這個例子我們可以看出,Decorator模式把問題分為兩部分:
    1) 如何實現提供新功能的對象。
    2) 如何為每種特殊情況組織對象。
    這樣能夠將Decorator對象的實現與決定如何使用Decorator的對象分離開來,從而提高了內聚性,因為每個Decorator對象只用關心自己添加的功能,無需關心自己是如何被加入到對象鏈中。還可以任意地重排Decorator的順序,無需改變其任何代碼。
    小結:Decorator模式的適用場合是,各種可選的功能在另一個肯定要執行的功能之前或之后執行。

     

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

    Copyright © flustar

    主站蜘蛛池模板: 久热免费在线视频| 国产精品成人免费一区二区| 免费二级毛片免费完整视频| 亚洲深深色噜噜狠狠网站| 国产精品久久久久久久久免费| 亚洲AV乱码久久精品蜜桃 | 久久久久久成人毛片免费看| 伊人久久大香线蕉亚洲| a毛片免费全部播放完整成| 久久ww精品w免费人成| 亚洲精品无码MV在线观看| 在线观看免费无码视频| 亚洲国产精品无码AAA片| 色播在线永久免费视频网站| 在线观看亚洲精品福利片| 999zyz**站免费毛片| 久久久久亚洲AV成人无码网站| 久久久久久影院久久久久免费精品国产小说 | 亚洲国产欧洲综合997久久| 噜噜嘿在线视频免费观看| 免费黄色毛片视频| 久久精品国产亚洲精品2020| 1000部免费啪啪十八未年禁止观看| 亚洲精品国产专区91在线| 国产成人免费网站| 日韩亚洲人成在线综合| 亚洲女同成人AⅤ人片在线观看 | 99免费在线观看视频| 亚洲免费网站在线观看| 亚洲熟妇AV日韩熟妇在线| 成人免费a级毛片| 美女视频黄频a免费观看| 亚洲精品无码MV在线观看| 69视频免费观看l| 久久人午夜亚洲精品无码区| 国产综合精品久久亚洲| 100000免费啪啪18免进| 边摸边吃奶边做爽免费视频网站| 亚洲日韩精品无码一区二区三区| 国产高清免费视频| 国产免费高清69式视频在线观看|