设计模式之责任链模式

责任链模式的定义如下:

是多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它位置。


责任链模式的通用类图如下:



下面以《设计模式之禅》中的例子说明一下,中国古代对父母制定了“三从四德”的规范,所谓“三从”指“未嫁从父,既嫁从夫,夫死从子”,下面就用责任链模式来说明一下“三从”,加入一个女人要出门逛街,在出嫁之前需要征得父亲的同意,出嫁之后需要得到丈夫的同意,丈夫如果死了需要得到儿子的同意.


代码如下:


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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值