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


⑥测试类
public class Client {public static void main(String[] args) {//随机挑选几个女性Random rand = new Random();ArrayList arrayList = new ArrayList();for (int i = 0; i < 5; i++) {arrayList.add(new Women(rand.nextInt(4), "我要出去逛街"));}//定义三个请示对象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);}}}
在中设置请求的传递顺序,先向父亲请示,不是父亲应该解决的问题,则由父亲传递到丈夫类解决,若不是丈夫类解决的问题则传递到儿子类解决,最终的结果必然有一个返回 。
3. 责任链模式的定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系 。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止 。
责任链模式的重点是在“链”上,由一条链去处理相似的请求在链中决定谁来处理这个请求,并返回相应的结果:
①抽象类
public abstract class Handler {private Handler nextHandler;//每个处理者都必须对请求做出处理//被final修改的抽象方法不能被继承public final Response handleMessage(Request request) {Response response = null;//判断是否是自己的处理级别if (this.getHandlerLevel().equals(request.getRequestLevel())) {response = this.echo(request);} else { //不属于自己的处理级别//判断是否有下一个处理者if (this.nextHandler != null) {response = this.nextHandler.handleMessage(request);} else {//没有适当的处理者,业务自行处理}}return response;}//设置下一个处理者是谁public void setNext(Handler _handler) {this.nextHandler = _handler;}//每个处理者都有一个处理级别protected abstract Level getHandlerLevel();//每个处理者都必须实现处理任务protected abstract Response echo(Request request);}
②处理者子类
public class ConcreteHandler1 extends Handler {/*** 定义自己的处理逻辑*/protected Response echo(Request request) {//完成处理逻辑return null;}/*** 设置自己的处理级别*/protected Level getHandlerLevel() {//设置自己的处理级别return null;}}
③处理者子类
public class ConcreteHandler2 extends Handler {/*** 定义自己的处理逻辑*/protected Response echo(Request request) {//完成处理逻辑return null;}/*** 定义自己的处理逻辑*/protected Level getHandlerLevel() {//设置自己的处理级别return null;}}
④处理者子类
public class ConcreteHandler3 extends Handler {/*** 定义自己的处理逻辑*/protected Response echo(Request request) {//完成处理逻辑return null;}/*** 设置自己的处理级别*/protected Level getHandlerLevel() {//设置自己的处理级别return null;}}
⑤测试类
public class Client {public static void main(String[] args) {//声明所有的处理节点Handler handler1 = new ConcreteHandler1();Handler handler2 = new ConcreteHandler2();Handler handler3 = new ConcreteHandler3();//设置链中的阶段顺序1-->2-->3handler1.setNext(handler2);handler2.setNext(handler3);//提交请求,返回结果Response response = handler1.handlerMessage(new Request());}}
【读书 | 设计模式之禅 - 责任链模式】责任链在实际的项目中使用也是比较多的,我曾经做过这样一个项目,界面上有一个用户注册功能,注册用户分两种,一种是VIP用户,也就是在该单位办理过业务的,一种是普通用户,一个用户的注册要填写一堆信息,VIP用户只比普通用户多了一个输入项:VIP序列号 。注册后还需要激活,VIP和普通用户的激活流程也是不同的,VIP是自动发送邮件到用户的邮箱中就算激活了,普通用户要发送短信才能激活,为什么呢?获得手机号码以后好发广告短信啊!项目组就采用了责任链模式,甭管从前台传递过来的是VIP用户信息还是普通用户信息,统一传递到一个处理入口,通过责任链来完成任务的处理 。