努力,成長(zhǎng),提高

          在追求中進(jìn)步
          數(shù)據(jù)加載中……
          decorator裝飾模式的一種改進(jìn)寫(xiě)法
          倘若,有這么一個(gè)需求,對(duì)于一個(gè)數(shù)字,如果是負(fù)的,那么需要變成正的相反數(shù),如果是2的倍數(shù),那么就除以2,如果是3的倍數(shù),那么就除以3,可能以后還有其他的需求,比如是5的倍數(shù),就再除以5,或者是6的倍數(shù),那么就加上6,也就是結(jié)果與順序息息相關(guān),那么應(yīng)該如何來(lái)實(shí)現(xiàn)呢?
          如果寫(xiě)一個(gè)類(lèi)的方法,按照這個(gè)需求來(lái)寫(xiě)if語(yǔ)句,可以,但是,如果有兩套定制的呢?一套需要其中的幾種變化,另外需要另外幾種,那么就需要2個(gè)方法,而且其中有很多的重復(fù)代碼,這樣行不通的.
          其實(shí)設(shè)計(jì)模式說(shuō)到底,其根本思想就是找到變化并封裝之.這里變化的是處理的方法,那么我們就把它封裝起來(lái).實(shí)現(xiàn)的類(lèi)如下:

          package decorater;

          public class Integor {
              
          private Integer x;

              
          public Integer getX() {
                  
          return x;
              }

              
          public void setX(Integer x) {
                  
          this.x = x;
              }
              Integor(Integer x){
                  
          this.x = x;
              }
          }
          由于Integer不能修改傳遞的值,所以寫(xiě)一個(gè)類(lèi)來(lái)封裝一個(gè)integer

          /**
           * 
           
          */
          package decorater;

          public abstract class Decorater {
              
          private Decorater next;

              
          public Decorater setNext(Decorater dcrtr) {
                  
          this.next = dcrtr;
                  
          return this.next;
              }

              
          public void process(Integor x) {
                  
          this.executeBefore(x);
                  
          if (this.next != null) {
                      
          this.next.process(x);
                  }
                  
          this.executeAfter(x);
              }

              
          protected abstract void executeBefore(Object x);

              
          protected abstract void executeAfter(Object x);

          }
          每個(gè)實(shí)現(xiàn)的類(lèi)只需要來(lái)實(shí)現(xiàn)executeBefore和executeAfter方法即可.
          注意實(shí)現(xiàn)的順序是
          decorater1.executeBefore->decorater2.executeBefore->decorater3.executeBefore->decorater3.executeAfter->decorater2.executeAfter->decorater1.executerAfter

          package decorater;

          public class PositiveDecorater extends Decorater {

              @Override
              
          protected void executeAfter(Object x) {

                  System.out.println(
          "PositiveDecorater end!");
              }

              @Override
              
          protected void executeBefore(Object x) {
                  
          // TODO Auto-generated method stub

                  System.out.println(
          "starting PositiveDecorater!");
                  Integor in 
          = (Integor) x;
                  
          if (in.getX() < 0)
                      in.setX(
          -in.getX());
              }

          }

          package decorater;

          public class Devide2Decorater extends Decorater {

              @Override
              
          protected void executeAfter(Object x) {
                  System.out.println(
          "Devide2Decorater end!");

              }

              @Override
              
          protected void executeBefore(Object x) {
                  System.out.println(
          "Starting Devide2Decorater!");
                  Integor in 
          = (Integor) x;
                  
          if (in.getX() % 2 == 0) {
                      in.setX(in.getX() 
          / 2);
                  }

              }

          }

          package decorater;

          public class Devide3Decorater extends Decorater {

              @Override
              
          protected void executeAfter(Object x) {
                  System.out.println(
          "Devide3Decorater end!");
              }

              @Override
              
          protected void executeBefore(Object x) {

                  System.out.println(
          "Starting Devide3Decorater!");
                  Integor in 
          = (Integor) x;
                  
          if (in.getX() % 3 == 0) {
                      in.setX(in.getX() 
          / 3);
                  }

              }

          }

          /**
           * 
           
          */
          package decorater;

          /**
           * 
          @author KONGHE
           * 
           
          */
          public class Main {

              
          /**
               * 
          @param args
               
          */
              
          public static void main(String[] args) {
                  Decorater a 
          = new PositiveDecorater();
                  a.setNext(
          new Devide2Decorater()).setNext(new Devide3Decorater());
                  Integor x 
          = new Integor(-18);
                  a.process(x);
                  System.out.println(x.getX());

              }

          }

          輸出結(jié)果是:
          starting PositiveDecorater!
          Starting Devide2Decorater!
          Starting Devide3Decorater!
          Devide3Decorater end!
          Devide2Decorater end!
          PositiveDecorater end!
          3

          其實(shí)每種設(shè)計(jì)模式的核心思想都是一致的,但是沒(méi)有必要照本宣科,只要注意其模式的精髓,就可以了,剩下的就是自己去按照實(shí)現(xiàn)來(lái)設(shè)計(jì)其中的細(xì)節(jié)了.比如我設(shè)計(jì)這個(gè)模式,就是先寫(xiě)了main函數(shù),把其中的方法寫(xiě)好,然后去按照這個(gè)實(shí)現(xiàn)來(lái)想去如何實(shí)現(xiàn),這樣才更符合解決實(shí)際的問(wèn)題.其實(shí)decorater模式有很多種實(shí)現(xiàn)方式.比如下面的這種解法,也可:

          /**
           * 
           
          */
          package decorator;

          /**
           * 
          @author KONGHE
           * 
           
          */
          public class Main {

              
          /**
               * 
          @param args
               
          */
              
          public static void main(String[] args) {
                  DecoraterChain a 
          = new DecoraterChain();
                  a.setNext(
          new PositiveDecorater()).setNext(new Devide2Decorater()).setNext(new Devide3Decorater());
                  Integer x 
          = -32;
                  x 
          = a.process(x);
                  System.out.println(x);

              }

          }

          /**
           * 
           
          */
          package decorator;

          import java.util.ArrayList;
          import java.util.List;

          /**
           * 
          @author KONGHE
           * 
           
          */
          public class DecoraterChain {
              
          private List<Decorater> decorater = new ArrayList<Decorater>();

              
          public DecoraterChain setNext(Decorater decrter) {
                  decorater.add(decrter);
                  
          return this;
              }

              
          public Integer process(Integer x) {
                  
          for (int i = 0; i < this.decorater.size(); i++) {
                      x 
          = this.decorater.get(i).process(x);
                  }
                  
          return x;
              }

          }

          /**
           * 
           
          */
          package decorator;


          /**
           * 
          @author KONGHE
           * 
           
          */
          public abstract class Decorater {
              
          public abstract Integer process(Integer x);

          }


          總而言之,模式是為了具體的實(shí)際情況而服務(wù)的,不要為了一定要去用某種設(shè)計(jì)模式而委屈自己的需求.
          在設(shè)計(jì)的時(shí)候多想想,可能某天你再讀設(shè)計(jì)模式的書(shū),你會(huì)發(fā)現(xiàn),原來(lái)我之前寫(xiě)的代碼,包含了這么多的設(shè)計(jì)模式啊!




          posted on 2009-05-22 17:20 孔陽(yáng) 閱讀(1375) 評(píng)論(3)  編輯  收藏

          評(píng)論

          # re: decorator裝飾模式的一種改進(jìn)寫(xiě)法 2009-05-22 19:32 杰德。張

          學(xué)以致用才是硬道理。。。學(xué)習(xí)了。。

          # re: decorator裝飾模式的一種改進(jìn)寫(xiě)法 2013-04-10 09:18 dohkoos

          不是起個(gè)Decorator類(lèi)名就叫Decorator模式的,你的這個(gè)實(shí)現(xiàn)明顯是Strategy模式的變形。

          # re: decorator裝飾模式的一種改進(jìn)寫(xiě)法 2013-04-21 11:39 孔陽(yáng)

          @dohkoos
          其實(shí),用多了心中無(wú)模式才是最終的模式.
          與其討論是什么設(shè)計(jì)模式,倒不如考慮, 某種實(shí)現(xiàn)是否真正的滿足了需求.

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 毕节市| 东阳市| 黄山市| 五莲县| 巴林左旗| 那曲县| 巴彦淖尔市| 华蓥市| 永安市| 绍兴县| 上虞市| 和田县| 绥江县| 苍梧县| 渑池县| 铜山县| 长海县| 渭南市| 江门市| 扶余县| 尼玛县| 莆田市| 同德县| 天长市| 屯昌县| 太仆寺旗| 武威市| 东乌珠穆沁旗| 漾濞| 石城县| 许昌县| 中山市| 乌兰县| 湟中县| 景宁| 博乐市| 波密县| 富平县| 马尔康县| 武定县| 涡阳县|