<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

    主站蜘蛛池模板: 一级毛片免费毛片一级毛片免费| 日韩a级毛片免费观看| 羞羞视频免费网站日本| 亚洲伊人久久大香线蕉| 国产成人亚洲精品青草天美| 免费人成视频在线观看不卡| 亚洲免费福利视频| 污视频在线免费观看| yy一级毛片免费视频| 亚洲av无码专区在线电影| 亚洲一级大黄大色毛片| 亚洲午夜久久影院| 亚洲精品乱码久久久久久按摩| 内射无码专区久久亚洲| 成年女人免费v片| 91成年人免费视频| 99久久国产免费-99久久国产免费| 国产中文字幕在线免费观看| 羞羞视频免费网站日本| 麻豆一区二区三区蜜桃免费| 亚洲精品乱码久久久久久蜜桃图片| 亚洲国产日韩女人aaaaaa毛片在线| 亚洲一本综合久久| 亚洲成AV人片在WWW色猫咪| 亚洲午夜无码片在线观看影院猛| 亚洲Av无码乱码在线观看性色| 国产精品视_精品国产免费| 在线免费观看a级片| 四虎www免费人成| 永久免费AV无码网站在线观看| 97在线观免费视频观看| 久久不见久久见中文字幕免费| 免费国产作爱视频网站| 美女视频黄a视频全免费| www.黄色免费网站| 免费看国产精品3a黄的视频| 免费看的黄色大片| 国产乱子影视频上线免费观看| 免费看国产一级片| 亚洲五月午夜免费在线视频| 国产亚洲精品高清在线|