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

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲欧洲免费视频| 9i9精品国产免费久久| 2015日韩永久免费视频播放| 亚洲尤码不卡AV麻豆| 天堂亚洲免费视频| 亚洲午夜爱爱香蕉片| 一区二区免费国产在线观看| 亚洲AV中文无码乱人伦在线视色| 美女免费视频一区二区三区| 四虎永久在线精品视频免费观看| 无忧传媒视频免费观看入口| 三上悠亚亚洲一区高清| 国产免费一级高清淫曰本片| 国产亚洲综合久久系列| 久草免费手机视频| 亚洲乱码卡三乱码新区| 成人免费视频一区| 免费一级全黄少妇性色生活片 | 亚洲国产精品第一区二区| 久久免费国产视频| 亚洲视频中文字幕在线| 久久精品无码一区二区三区免费| 亚洲欧洲av综合色无码| 亚洲国产小视频精品久久久三级| 国产午夜不卡AV免费| 亚洲国产精品专区| 亚洲第一页日韩专区| 91香蕉在线观看免费高清 | 免费国产草莓视频在线观看黄| 亚洲日本一区二区一本一道| 东方aⅴ免费观看久久av| 亚洲国产成人精品久久| 免费观看国产小粉嫩喷水| 中文字幕视频免费在线观看| 亚洲欧洲精品在线| 亚洲人成影院在线观看| 最近免费中文字幕大全免费| 亚洲国产成人手机在线观看| 自拍偷自拍亚洲精品情侣| 国产1024精品视频专区免费| 青青青视频免费观看|