城市獵人

          在一網情深的日子里,誰能說得清是苦是甜,只知道確定了就義無反顧
          posts - 1, comments - 7, trackbacks - 0, articles - 89

          導航

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(3)

          文章分類(90)

          文章檔案(90)

          收藏夾(12)

          搜索

          •  

          最新評論

          模式(三):裝飾者(decorator)模式

          Posted on 2008-07-21 12:15 sailor 閱讀(181) 評論(0)  編輯  收藏 所屬分類: 模式
          1、定義
              動態地將責任附加到對象上。若要擴展功能,裝飾著提供了比繼承者更有彈性的替代方案。

          2、原則
              為交互對象之間的耦合設計而努力
              對擴展開放,對修改關閉

          3、適用環境
              在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責。
              處理那些可以撤消的職責。
              當不能采用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,為支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。另一種情況可能是因為類定義被隱藏,或類定義不能用于生成子類。

          4、本模式中的角色

              抽象構件(Component):給出一個抽象接口,以規范準備接收附加責任的對象。
              具體構件(Concrete Component):定義一個接收到附加責任的類。
              裝飾(Decorator):持有一個構件對象的實例,并定義與抽象構件一致的接口。
              具體裝飾(Concrete Decorator):負責給構件對象貼上附加的責任。

          Decorator.jpg(圖例)


          具體例子:
          先定義抽象構件:
          package decorator;
          //抽象構件接口
          public interface Component{
              
          public void sampleOperation();
          }

          一個具體構件----門:
          package decorator;
          //具體構件-----門
          public class  Door implements Component{
              
          //實現方法
              public void sampleOperation(){
                  System.out.println(
          "build a door");
              }

          }

          裝飾(抽象類):
          package decorator;

          public abstract class Decorator implements Component{
              
          //持有一個構件對象的實例
              private Component component;
              
          //構造方法
              public Decorator(Component component){
                  
          this.component=component;
              }

              
          //方法的具體實現
              public  void sampleOperation(){
                  component.sampleOperation();
              }

          }

          具體裝飾:
          package decorator;
          //具體裝飾----把手
          public class Knob extends Decorator{

              
          public Knob(Component component){
                  
          super(component);
              }

              
              
          public void sampleOperation(){
                  
          super.sampleOperation();
                  
          //附加的"責任"
                  System.out.println("add a knob");
              }

          }
          package decorator;
          //具體裝飾----鎖
          public class Lock extends Decorator{

              
          public Lock(Component component){
                  
          super(component);
              }

              
          public void sampleOperation(){
                  
          super.sampleOperation();
                  
          //附加"責任"
                  System.out.println("add a lock");
              }

          }
          運行類:
          package decorator;

          public class DecoratorPattern{
              
          public static void main(String[] args){
                  Component door
          =new Door();
                  Component lock
          =new Lock(door);
                  Component knob
          =new Knob(lock);
                  knob.sampleOperation();
              }

          }

          運行結果:
          build a door
          add a lock
          add a knob
          Press any key to continue...

          參考資料:《Head First 設計模式》
                              設計模式學習筆記(十)--------裝飾(Decorator)模式
          主站蜘蛛池模板: 双流县| 陆丰市| 高平市| 柳江县| 清水县| 河源市| 沙河市| 盐城市| 龙州县| 江华| 墨江| 卓资县| 泗洪县| 大庆市| 宽甸| 广平县| 密云县| 高陵县| 开平市| 邻水| 枝江市| 界首市| 呼和浩特市| 吉安市| 鄂尔多斯市| 克什克腾旗| 娄烦县| 扶沟县| 翁牛特旗| 靖边县| 迁西县| 广德县| 会同县| 山东| 乾安县| 尚志市| 仪陇县| 化州市| 尼木县| 新兴县| 沂源县|