读书 | 设计模式之禅 - 责任链模式( 二 )


父亲、丈夫、儿子每个节点有两个选择:要么承担责任,做出回应;要么把请求转发到后序环节 。
三个实现类、、Son只要实现构造函数和父类中的抽象方法就可以了,具体由谁处理女性提出的请求,都已经转移到了抽象类中 。
①抽象类
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");}}
④ Son 子类
public class Son extends Handler {//儿子只处理母亲的请求public Son() {super(Handler.SON_LEVEL_REQUEST);}//儿子的答复protected void response(IWomen women) {System.out.println("--------母亲向儿子请示-------");System.out.println(women.getRequest());System.out.println("儿子的答复是:同意\n");}}
这三个类都很简单,构造方法是必须实现的,父类框定子类必须有一个显式构造函数,子类不实现编译不通过 。通过构造方法我们设置了各个类能处理的请求类型,只能处理请求类型为1(也就是女儿)的请求;只能处理请求类型类为2(也就是妻子)的请求,儿子只能处理请求类型为3(也就是母亲)的请求,那如果请求类型为4的该如何处理呢?在中我们已经判断了,如何没有相应的处理者(也就是没有下一环节),则视为不同意 。
⑤ Women 实现类
public class Women implements IWomen {/** 通过一个int类型的参数来描述妇女的个人状况* 1--未出嫁* 2--出嫁* 3--夫死*/private int type = 0;//妇女的请示private String 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;default:}}//获得自己的状况public int getType() {return this.type;}//获得妇女的请求public String getRequest() {return this.request;}}