我的漫漫程序之旅

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

          學(xué)習(xí)裝飾者模式(Decorator)

          1、定義及作用

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

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

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

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

                具體裝飾角色:實(shí)現(xiàn)抽象裝飾者角色,負(fù)責(zé)為具體構(gòu)件添加額外功能。

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

          package com.pattern.decorator2;
          /**
           * 抽象構(gòu)件角色
           * 
          @author zdw
           *
           
          */

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


          具體構(gòu)件角色:
          package com.pattern.decorator2;
          /**
           * 具體構(gòu)件角色
           * 
          @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
          {
              
          //抽象構(gòu)件角色的引用
              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ù)自己的需要擴(kuò)展
              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)
              
          {
                  
          // 一層套一層,進(jìn)行方法組合
                  Component component = new ConcreateDecorator(new ConcreateDecorator1(
                          
          new ConcreateComponent()));
                  component.functionA();
              }


          }

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

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



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

          主站蜘蛛池模板: 凤冈县| 托克逊县| 文水县| 循化| 延庆县| 竹北市| 临颍县| 天长市| 普定县| 镇安县| 瑞昌市| 吉安县| 夏津县| 石首市| 新乡市| 泾川县| 清原| 延川县| 普安县| 和田市| 哈密市| 沾益县| 宜州市| 长垣县| 温泉县| 宣威市| 木兰县| 康乐县| 罗江县| 新密市| 商都县| 乌鲁木齐市| 孟村| 溧水县| 石渠县| 镇原县| 鞍山市| 平邑县| 陕西省| 堆龙德庆县| 杨浦区|