我的漫漫程序之旅

          專注于JavaWeb開發(fā)
          隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
          數(shù)據(jù)加載中……

          學習裝飾者模式(Decorator)

          1、定義及作用

                該模式以對客戶端透明的方式擴展對象的功能。

          2、涉及角色
                抽象構件角色:定義一個抽象接口,來規(guī)范準備附加功能的類。

                具體構件角色:將要被附加功能的類,實現(xiàn)抽象構件角色接口。

                抽象裝飾者角色:持有對具體構件角色的引用并定義與抽象構件角色一致的接口。

                具體裝飾角色:實現(xiàn)抽象裝飾者角色,負責為具體構件添加額外功能。

           
            3、簡單實現(xiàn)
          抽象構件角色java 代碼:

          package com.pattern.decorator2;
          /**
           * 抽象構件角色
           * 
          @author zdw
           *
           
          */

          public interface Component
          {
              
          //默認方法A
              void functionA();
          }


          具體構件角色:
          package com.pattern.decorator2;
          /**
           * 具體構件角色
           * 
          @author zdw
           *
           
          */

          public class ConcreateComponent implements Component
          {
              
              
          public void functionA()
              
          {
                  System.out.println(
          "Function A");
              }


          }


          抽象裝飾者角色:
          package com.pattern.decorator2;

          /**
           * 抽象裝飾者角色
           * 
           * 
          @author zdw
           * 
           
          */

          public class Decorator implements Component
          {
              
          //抽象構件角色的引用
              private Component component;
              
              
          public Decorator(Component component)
              
          {
                  
          this.component = component;
              }


              
          public void functionA()
              
          {
                  component.functionA();
              }


          }

          具體裝飾者角色1:
          package com.pattern.decorator2;
          /**
           * 具體裝飾者角色
           * 
          @author zdw
           *
           
          */

          public class ConcreateDecorator1 extends Decorator
          {
              
          public ConcreateDecorator1(Component component)
              
          {
                  
          super(component);
              }


              @Override
              
          public void functionA()
              
          {
                  
          super.functionA();
                  
          this.functionB();
              }

              
          //根據(jù)自己的需要擴展
              private void functionB()
              
          {
                  System.out.println(
          "function B");
              }

          }


          具體裝飾者角色2:
          package com.pattern.decorator2;

          public class ConcreateDecorator extends Decorator
          {
              
          public ConcreateDecorator(Component component)
              
          {
                  
          super(component);
              }


              @Override
              
          public void functionA()
              
          {
                  
          super.functionA();
                  
          this.functionC();
              }


              
          private void functionC()
              
          {
                  System.out.println(
          "fucntion C");
              }

          }


          測試類:
          package com.pattern.decorator2;

          /**
           * 測試客戶端
           * 
           * 
          @author zdw
           * 
           
          */

          public class Client
          {

              
          /**
               * 
          @param args
               
          */

              
          public static void main(String[] args)
              
          {
                  
          // 一層套一層,進行方法組合
                  Component component = new ConcreateDecorator(new ConcreateDecorator1(
                          
          new ConcreateComponent()));
                  component.functionA();
              }


          }

          OO原則:動態(tài)地將責任附加到對象上。想要擴展功能,裝飾者提供有別于繼承的另一種選擇。

          要點:
          1、繼承屬于擴展形式之一,但不見得是達到彈性設計的最佳方案。
          2、在我們的設計中,應該允許行為可以被擴展,而不須修改現(xiàn)有的代碼。
          3、組合和委托可用于在運行時動態(tài)地加上新的行為。
          4、除了繼承,裝飾者模式也可以讓我們擴展行為。
          5、裝飾者模式意味著一群裝飾者類,這些類用來包裝具體組件。
          6、裝飾者類反映出被裝飾的組件類型(實際上,他們具有相同的類型,都經(jīng)過接口或繼承實現(xiàn))。
          7、裝飾者可以在被裝飾者的行為前面與/或后面加上自己的行為,甚至將被裝飾者的行為整個取代掉,而達到特定的目的。
          8、你可以有無所數(shù)個裝飾者包裝一個組件。
          9、裝飾者一般對組建的客戶是透明的,除非客戶程序依賴于組件的具體類型。
          10、裝飾者會導致設計中出現(xiàn)許多的小對象,如果過度使用,會讓程序變得很復雜。



          posted on 2008-05-25 09:58 々上善若水々 閱讀(1260) 評論(0)  編輯  收藏 所屬分類: 設計模式

          主站蜘蛛池模板: 饶阳县| 辽阳县| 都安| 万宁市| 高尔夫| 中方县| 阿坝| 奉新县| 赫章县| 玛沁县| 高邑县| 平遥县| 泸定县| 望城县| 横峰县| 阜阳市| 鄂托克前旗| 浪卡子县| 满洲里市| 灯塔市| 甘德县| 许昌市| 奉贤区| 陇南市| 蕲春县| 哈巴河县| 二手房| 桂林市| 化隆| 太康县| 乌拉特前旗| 巴彦淖尔市| 西盟| 禹城市| 清新县| 富源县| 南投市| 邮箱| 大庆市| 舟山市| 诏安县|