十三 每天学习一个设计模式:行为型之责任链模式( 四 )


儿子类只能处理等级为3的请示 。
public class Son extends Handler {/*** 儿子只处理母亲的请求*/public Son() {super(Handler.REQUEST_SON);}@Overrideprotected void response(IWomen women) {System.out.println("--------母亲向儿子请示--------");System.out.println(women.getRequest());System.out.println("儿子的答复是:同意");}}
这三个类都很简单,构造方法是必须实现的,父类框定子类必须有一个显式构造函数,子类不实现编译不通过 。通过构造方法我们设置了各个类能处理的请求类型,只能处理请求类型为1(也就是女儿)的请求;只能处理请求类型类为2(也就是妻子)的请求,儿子只能处理请求类型为3(也就是母亲)的请求,那如果请求类型为4的该如何处理呢?在中我们已经判断了,如何没有相应的处理者(也就是没有下一环节),则视为不同意 。
Women类的接口没有任何变化,实现类稍微有些变化 。
public class Women implements IWomen {/*** 妇女状况,1:未出嫁,2:出嫁,3:夫死*/private int type = 0;/*** 妇女的请示*/private String request = "";/*** 构造函数传递过来请求** @param type* @param request*/public Women(int type, String request) {this.type = type;switch (this.type) {case 1:this.request = "女儿的请求是:" + request;break;case 2:this.request = "妻子的请求是:" + request;break;case 3:this.request = "母亲的请求是:" + request;break;default:break;}}@Overridepublic int getType() {return this.type;}@Overridepublic String getRequest() {return this.request;}}
我们再来看类是怎么描述古代这一个礼节的 。
public class Client {public static void main(String[] args) {//随机挑选几个女性Random random = new Random();ArrayList arrayList = new ArrayList<>();for (int i = 0; i < 5; i++) {arrayList.add(new Women(random.nextInt(3) + 1, "我要出去逛街"));}//定义三个请示对象Handler father = new Father();Handler husband = new Husband();Handler son = new Son();//设置请示顺序father.setNext(husband);husband.setNext(son);for (IWomen women : arrayList) {father.handleMessage(women);}}}
在中设置请求的传递顺序,先向父亲请示,不是父亲应该解决的问题,则由父亲传递到丈夫类解决,若不是丈夫类解决的问题则传递到儿子类解决,最终的结果必然有一个返回,其运行结果如下所示 。
--------妻子向丈夫请示--------
妻子的请求是:我要出去逛街
丈夫的答复是:同意
--------妻子向丈夫请示--------
妻子的请求是:我要出去逛街
丈夫的答复是:同意

十三  每天学习一个设计模式:行为型之责任链模式

文章插图
--------妻子向丈夫请示--------
妻子的请求是:我要出去逛街
丈夫的答复是:同意
--------母亲向儿子请示--------
母亲的请求是:我要出去逛街
儿子的答复是:同意
--------女儿向父亲请示--------
女儿的请求是:我要出去逛街
父亲的答复是:同意
结果也正确,业务调用类也不用去做判断到底是需要谁去处理,而且抽象类的子类可以继续增加下去,只需要扩展传递链而已,调用类可以不用了解变化过程,甚至是谁在处理这个请求都不用知道 。在这种模式下,即使现代社会的一个小太妹穿越到古代(例如掉入时空隧道,或者时空突然扭转,甚至是突然魔法显灵),对“三从四德”没有任何了解也可以自由地应付,反正只要请示父亲就可以了,该父亲处理就父亲处理,不该父亲处理就往下传递 。这就是责任链模式 。
2.责任链模式的通用模版