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

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

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

    努力,成長,提高

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

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

    }
    每個實現(xiàn)的類只需要來實現(xiàn)executeBefore和executeAfter方法即可.
    注意實現(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è)計模式的核心思想都是一致的,但是沒有必要照本宣科,只要注意其模式的精髓,就可以了,剩下的就是自己去按照實現(xiàn)來設(shè)計其中的細節(jié)了.比如我設(shè)計這個模式,就是先寫了main函數(shù),把其中的方法寫好,然后去按照這個實現(xiàn)來想去如何實現(xiàn),這樣才更符合解決實際的問題.其實decorater模式有很多種實現(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);

    }


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




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

    評論

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

    學(xué)以致用才是硬道理。。。學(xué)習(xí)了。。
      回復(fù)  更多評論    

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

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

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

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 99国产精品视频免费观看| sihu国产精品永久免费| xx视频在线永久免费观看| 亚洲AⅤ男人的天堂在线观看| 亚洲高清免费在线观看| 亚洲免费一级视频| 动漫黄网站免费永久在线观看| 亚洲一级毛片免费观看| 成年在线观看免费人视频草莓| 亚洲精品国产精品| 国产一级淫片视频免费看| 真人无码作爱免费视频| 亚洲综合国产精品第一页| 青青操在线免费观看| 日本免费人成视频播放 | 国产yw855.c免费视频| 美女视频黄a视频全免费网站色| 免费在线看片网站| A片在线免费观看| 免费大片在线观看网站| 亚洲精品国产日韩无码AV永久免费网| 亚洲欧洲国产精品香蕉网| 亚洲国产成人久久精品大牛影视| 免费一看一级毛片| 成人无码WWW免费视频| 亚洲精品国产肉丝袜久久| 午夜精品在线免费观看| 亚洲黄片手机免费观看| 亚洲国产精品yw在线观看| 在线观看亚洲免费视频| 光棍天堂免费手机观看在线观看| 亚洲国产视频一区| 亚洲VA综合VA国产产VA中| 亚洲第一se情网站| 又粗又黄又猛又爽大片免费| 国产午夜精品理论片免费观看| 亚洲精品视频久久久| 99精品在线免费观看| 国产偷国产偷亚洲高清在线| 国产亚洲精品一品区99热| 天天天欲色欲色WWW免费|