<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    努力,成長,提高

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

    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不能修改傳遞的值,所以寫一個類來封裝一個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);

    }
    每個實現的類只需要來實現executeBefore和executeAfter方法即可.
    注意實現的順序是
    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());

        }

    }

    輸出結果是:
    starting PositiveDecorater!
    Starting Devide2Decorater!
    Starting Devide3Decorater!
    Devide3Decorater end!
    Devide2Decorater end!
    PositiveDecorater end!
    3

    其實每種設計模式的核心思想都是一致的,但是沒有必要照本宣科,只要注意其模式的精髓,就可以了,剩下的就是自己去按照實現來設計其中的細節了.比如我設計這個模式,就是先寫了main函數,把其中的方法寫好,然后去按照這個實現來想去如何實現,這樣才更符合解決實際的問題.其實decorater模式有很多種實現方式.比如下面的這種解法,也可:

    /**
     * 
     
    */
    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);

    }


    總而言之,模式是為了具體的實際情況而服務的,不要為了一定要去用某種設計模式而委屈自己的需求.
    在設計的時候多想想,可能某天你再讀設計模式的書,你會發現,原來我之前寫的代碼,包含了這么多的設計模式啊!




    posted on 2009-05-22 17:20 孔陽 閱讀(1372) 評論(3)  編輯  收藏

    評論

    # re: decorator裝飾模式的一種改進寫法 2009-05-22 19:32 杰德。張

    學以致用才是硬道理。。。學習了。。
      回復  更多評論    

    # re: decorator裝飾模式的一種改進寫法 2013-04-10 09:18 dohkoos

    不是起個Decorator類名就叫Decorator模式的,你的這個實現明顯是Strategy模式的變形。
      回復  更多評論    

    # re: decorator裝飾模式的一種改進寫法 2013-04-21 11:39 孔陽

    @dohkoos
    其實,用多了心中無模式才是最終的模式.
    與其討論是什么設計模式,倒不如考慮, 某種實現是否真正的滿足了需求.
      回復  更多評論    

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 青青青免费国产在线视频小草| 成人免费视频小说| 在线播放免费人成毛片乱码| 亚洲一区二区三区在线观看蜜桃| 亚洲中文无码永久免| 亚洲.国产.欧美一区二区三区| 国产福利免费视频 | 亚洲av永久无码精品漫画| 最近高清中文字幕无吗免费看| 在线亚洲v日韩v| 久久亚洲一区二区| 69成人免费视频无码专区| caoporm碰最新免费公开视频| 久久久亚洲欧洲日产国码aⅴ| 国产男女猛烈无遮挡免费网站| 精品一卡2卡三卡4卡免费视频| 精品亚洲成在人线AV无码| 国产亚洲精品精品国产亚洲综合| 无码人妻精品中文字幕免费东京热| 国产在亚洲线视频观看| 亚洲美女人黄网成人女| 亚洲国产成人五月综合网 | 国产真人无遮挡作爱免费视频| 成人电影在线免费观看| 亚洲AV色欲色欲WWW| 亚洲福利视频一区二区三区| 国产黄色一级毛片亚洲黄片大全| 国产成人精品免费视频大全麻豆| jizz日本免费| 亚洲AV无码一区二区三区牲色| 久久亚洲春色中文字幕久久久 | 亚洲电影国产一区| 亚洲日本中文字幕一区二区三区| 国产精品视频永久免费播放| 久草视频在线免费看| 四虎国产精品永免费| 亚洲色最新高清av网站| 亚洲欧洲另类春色校园小说| 亚洲精品V欧洲精品V日韩精品| 四虎影视在线永久免费看黄| 成年女人视频网站免费m|