設計模式之責任鏈模式

責任鏈模式的定義如下:

是多個對象都有機會處理請求,從而避免了請求的發送者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有對象處理它位置。


責任鏈模式的通用類圖如下:



下面以《設計模式之禪》中的例子說明一下,中國古代對父母制定了“三從四德”的規範,所謂“三從”指“未嫁從父,既嫁從夫,夫死從子”,下面就用責任鏈模式來說明一下“三從”,加入一個女人要出門逛街,在出嫁之前需要徵得父親的同意,出嫁之後需要得到丈夫的同意,丈夫如果死了需要得到兒子的同意.


代碼如下:


public abstract class Handler {

    public final static int FATHER_LEVEL_RWQUESR = 1;
    public final static int HUSBAND_LEVEL_RWQUESR = 2;
    public final static int SON_LEVEL_RWQUESR = 3;

    private int level = 0;

    // 下一責任人
    private Handler nextHandler;

    public Handler(int level) {
        this.level = level;
    }

    public final void handleMessage(IWomen women) {
        if (level == women.getType()) {
            this.response(women);
        } else {
            if (nextHandler != null) {
                nextHandler.handleMessage(women);
            } else {
                System.out.println("沒有地方請示了,按不同意處理");
            }
        }
    }

    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    /**
     * @param women
     */
    protected abstract void response(IWomen women);
}

public class Father extends Handler {

    /**
     * @param level
     */
    public Father() {
        super(FATHER_LEVEL_RWQUESR);
    }

    /**
     * @param women
     * @see com.huashao.chapter.chapter16.Handler#response(com.huashao.chapter.chapter16.IWomen)
     */
    @Override
    protected void response(IWomen women) {

        System.out.println(women.getRequest());
        System.out.println("父親的答覆:同意");
    }

}

public class Husband extends Handler {

    /**
     * @param level
     */
    public Husband() {
        super(HUSBAND_LEVEL_RWQUESR);
    }

    /**
     * @param women
     * @see com.huashao.chapter.chapter16.Handler#response(com.huashao.chapter.chapter16.IWomen)
     */
    @Override
    protected void response(IWomen women) {

        System.out.println( women.getRequest());
        System.out.println("丈夫的答覆是:同意");
    }

}

public class Son extends Handler {

    /**
     * @param level
     */
    public Son() {
        super(SON_LEVEL_RWQUESR);
    }

    /**
     * @param women
     * @see com.huashao.chapter.chapter16.Handler#response(com.huashao.chapter.chapter16.IWomen)
     */
    @Override
    protected void response(IWomen women) {

        System.out.println( women.getRequest());
        System.out.println("兒子的答覆是:同意");
    }

}

public interface IWomen {

   int getType();

   String getRequest();
}

public class Women implements IWomen {

    /**
     * 通過int類型的參數來描述婦女的個人狀況 1--未出嫁 2--出嫁 3--夫死
     */
    private int type = 0;

    private String message;// 婦女的請示

    public Women(int type, String message) {
        this.type = type;
        switch (type) {
            case 1:
                this.message = "女兒的請求是:" + message;
                break;
            case 2:
                this.message = "妻子的請求是:" + message;
                break;
            case 3:
                this.message = "母親的請求是:" + message;
                break;
        }
    }

    /**
     * @return
     * @see com.huashao.chapter.chapter16.IWomen#getType()
     */
    @Override
    public int getType() {
        // TODO Auto-generated method stub
        return type;
    }

    /**
     * @return
     * @see com.huashao.chapter.chapter16.IWomen#getRequest()
     */
    @Override
    public String getRequest() {
        // TODO Auto-generated method stub
        return message;
    }

}

public class Client {

    public static void main(String[] args) {
        Random random = new Random();

        List<IWomen> list = new ArrayList<IWomen>();

        for (int i = 0; i < 5; i++) {
            list.add(new Women(random.nextInt(4), "我要出去逛街"));
        }

        Handler father = new Father();
        Handler husband = new Husband();
        Handler son = new Son();

        father.setNextHandler(husband);
        husband.setNextHandler(son);

        for (IWomen women : list) {
            father.handleMessage(women);
        }
    }
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章