城市獵人

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

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

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

          2、原則
              為交互對(duì)象之間的耦合設(shè)計(jì)而努力
              對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉

          3、適用環(huán)境
              在不影響其他對(duì)象的情況下,以動(dòng)態(tài)、透明的方式給單個(gè)對(duì)象添加職責(zé)。
              處理那些可以撤消的職責(zé)。
              當(dāng)不能采用生成子類的方法進(jìn)行擴(kuò)充時(shí)。一種情況是,可能有大量獨(dú)立的擴(kuò)展,為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長(zhǎng)。另一種情況可能是因?yàn)轭惗x被隱藏,或類定義不能用于生成子類。

          4、本模式中的角色

              抽象構(gòu)件(Component):給出一個(gè)抽象接口,以規(guī)范準(zhǔn)備接收附加責(zé)任的對(duì)象。
              具體構(gòu)件(Concrete Component):定義一個(gè)接收到附加責(zé)任的類。
              裝飾(Decorator):持有一個(gè)構(gòu)件對(duì)象的實(shí)例,并定義與抽象構(gòu)件一致的接口。
              具體裝飾(Concrete Decorator):負(fù)責(zé)給構(gòu)件對(duì)象貼上附加的責(zé)任。

          Decorator.jpg(圖例)


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

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

          }

          裝飾(抽象類):
          package decorator;

          public abstract class Decorator implements Component{
              
          //持有一個(gè)構(gòu)件對(duì)象的實(shí)例
              private Component component;
              
          //構(gòu)造方法
              public Decorator(Component component){
                  
          this.component=component;
              }

              
          //方法的具體實(shí)現(xiàn)
              public  void sampleOperation(){
                  component.sampleOperation();
              }

          }

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

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

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

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

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

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

          }
          運(yùn)行類:
          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();
              }

          }

          運(yùn)行結(jié)果:
          build a door
          add a lock
          add a knob
          Press any key to continue...

          參考資料:《Head First 設(shè)計(jì)模式》
                              設(shè)計(jì)模式學(xué)習(xí)筆記(十)--------裝飾(Decorator)模式
          主站蜘蛛池模板: 乳山市| 政和县| 靖江市| 德昌县| 青浦区| 乌苏市| 宁国市| 浦城县| 双峰县| 长垣县| 鹤山市| 平乐县| 东兰县| 遂溪县| 瑞安市| 射阳县| 娱乐| 象州县| 舒城县| 常州市| 宜君县| 眉山市| 南汇区| 曲周县| 田东县| 西盟| 贵溪市| 甘泉县| 鞍山市| 邵阳县| 镇坪县| 苏尼特左旗| 永仁县| 于田县| 杭锦后旗| 嘉祥县| 南平市| 天等县| 从江县| 丰顺县| 石门县|