<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免费观看| 亚洲av色影在线| 国产精品成人免费综合| 国产乱码免费卡1卡二卡3卡| 国产在线观a免费观看| 偷自拍亚洲视频在线观看99| 亚洲国产人成在线观看| 亚洲av中文无码乱人伦在线r▽| 国产女高清在线看免费观看| 久久久久久久91精品免费观看| 精品在线免费观看| a级毛片免费观看网站| 亚洲AV无码一区二区乱子仑| 亚洲一卡二卡三卡| 亚洲另类精品xxxx人妖| 亚洲视频免费一区| 97久久精品亚洲中文字幕无码| 亚洲国产精品无码久久久不卡| 中文亚洲AV片在线观看不卡| 亚洲精品国产va在线观看蜜芽| 四虎影视在线永久免费看黄| 白白国产永久免费视频| 免费黄色小视频网站| 永久免费AV无码网站在线观看| 在线观看免费成人| 免费无遮挡无码视频网站| 暖暖免费高清日本中文| 在线A级毛片无码免费真人| 在线jlzzjlzz免费播放| 精品免费国产一区二区三区| 国产网站在线免费观看| 四虎在线播放免费永久视频| 亚洲A∨午夜成人片精品网站| 免费a级毛片18以上观看精品| 婷婷综合缴情亚洲狠狠尤物| 亚洲女人被黑人巨大进入| 中文字幕亚洲图片| 亚洲邪恶天堂影院在线观看| 精品特级一级毛片免费观看| 亚洲AV成人精品日韩一区 |