设计模式—— 十六 :责任链模式( 三 )


● 异常情况欠考虑
妻子只能向丈夫请示吗?如果妻子(比如一个现代女性穿越到古代了 , 不懂什么“三从四德”)向自己的父亲请示了 , 父亲应该做何处理?我们的程序上可没有体现出来 , 逻辑失败了!
引入责任链模式
针对上面的问题 , 这时候就该考虑引入责任链模式了 。
可以抽象成这样一个结构 , 女性的请求先发送到父亲类 , 父亲类一看是自己要处理的 , 就 作出回应处理 , 如果女儿已经出嫁了 , 那就要把这个请求转发到女婿来处理 , 那女婿一旦去天国报道了 , 那就由儿子来处理这个请求 , 类似于如图16-3所示的顺序处理图:
图16-3:女性请示的顺序处理图

设计模式—— 十六 :责任链模式

文章插图
父亲、丈夫、儿子每个节点有两个选择:要么承担责任 , 做出回应;要么把请求转发到后序环节 。
根据责任链模式 , 修改后的类图如下:
图16-4:使用责任链模式后的女子“三从”类图
实现如下:
public abstract class Handler {public final static int FATHER_LEVEL_REQUEST = 1;public final static int HUSBAND_LEVEL_REQUEST = 2;public final static int SON_LEVEL_REQUEST = 3;// 能处理的级别private int level = 0;// 责任传递 , 下一个人责任人是谁private Handler nextHandler;// 每个类都要说明一下自己能处理哪些请求public Handler(int _level) {this.level = _level;}// 一个女性(女儿、妻子或者是母亲)要求逛街 , 你要处理这个请求public final void HandleMessage(IWomen women) {if (women.getType() == this.level) {this.response(women);} else if (this.nextHandler != null) {// 有后续环节 , 才把请求往后递送this.nextHandler.HandleMessage(women);} else {// 已经没有后续处理人了 , 不用处理了System.out.println("---没地方请示了 , 按不同意处理---\n");}}/** 如果不属于你处理的请求 , 你应该让她找下一个环节的人 , 如女儿出嫁了 ,  * 还向父亲请示是否可以逛街 , 那父亲就应该告诉女儿 , 应该找丈夫请示 */public void setNext(Handler _handler) {this.nextHandler = _handler;}//有请示那当然要回应protected abstract void response(IWomen women);}
在这里也用到模板方法模式 , 在模板方法中判断请求的级别和当前能够处理的级别 , 如果相同则调用基本方法 , 做出 反馈;如果不相等 , 则传递到下一个环节 , 由下一环节做出回应 , 如果已经达到环节结尾 ,  则直接做不同意处理 。基本方法需要各个实现类实现 , 每个实现类只要实现两个职 责:一是定义自己能够处理的等级级别;二是对请求做出回应 。
三个实现类如下:三个实现类分别处理不同等级的请求
public class Father extends Handler {// 父亲只处理女儿的请求public Father() {super(Handler.FATHER_LEVEL_REQUEST);}// 父亲的答复protected void response(IWomen women) {System.out.println("--------女儿向父亲请示-------");System.out.println(women.getRequest());System.out.println("父亲的答复是:同意\n");}}
public class Husband extends Handler {// 丈夫只处理妻子的请求public Husband() {super(Handler.HUSBAND_LEVEL_REQUEST);}//丈夫请示的答复 protected void response(IWomen women) {System.out.println("--------妻子向丈夫请示-------");System.out.println(women.getRequest());System.out.println("丈夫的答复是:同意\n");}}