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

文章目录责任链模式优缺点 责任链模式应用场景
什么是责任链模式?
职责链模式的定义:
Avoidtheof ato itsbymore than oneatothe .Chain theand pass thealong the chain until anit.(使多个对象都有机会处理请求 , 从而避免了请求的发送者和接受者之间的耦合关 系 。将这些对象连成一条链 , 并沿着这条链传递该请求 , 直到有对象处理它为止 。)
责任链模式的重点是在“链”上 , 由一条链去处理相似的请求在链中决定谁来处理这个请求 , 并返回相应的结果 , 
通用类图如图16-1所示:
图16-1:责任链模式模式通用类图
责任链模式的核心在“链”上 , “链”是由多个处理者组成的 , 包含如下几个角色:
● (抽象处理者):
抽象处理者实现三个职责:
public abstract class Handler {private Handler nextHandler; // 每个处理者都必须对请求做出处理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);}
在处理者中涉及三个类:Level类负责定义请求和处理级别 , 类负责封装请 求 , 负责封装链中返回的结果 , 该三个类都需要根据业务产生 , 可以在实际应用中完成相关的业务填充:
public class Level {//定义一个请求和处理等级}public class Request {//请求的等级 public Level getRequestLevel(){ return null; }}public class Response {//处理者返回的数据}
● (具体处理者):
public class ConcreteHandler1 extends Handler{/*** 设置自己的处理级别*/@Overrideprotected Level getHandlerLevel() {// TODO Auto-generated method stubreturn null;}/*** 定义自己的处理逻辑*/@Overrideprotected Response echo(Request request) {// TODO Auto-generated method stubreturn null;}}
定义了三个处理者 , 代码都是一样 , 此处不重复贴出 。
● (客户端):在客户端或高层模块中对链进行组装 , 并传递请求 , 返回结果 。
public class Client {/*** @param args*/public static void main(String[] args) {//声明所有的处理节点Handler handler1 = new ConcreteHandler1(); Handler handler2 = new ConcreteHandler2(); Handler handler3 = new ConcreteHandler3(); //设置链中的阶段顺序1-->2-->3 handler1.setNext(handler2); handler2.setNext(handler3); //提交请求 , 返回结果 Response response = handler1.handleMessage(new Request());}}
在实际应用中 , 一般会有一个封装类对责任模式进行封装 , 也就是替代类 , 直接返回链中的第一个处理者 , 具体链的设置不需要高层次模块关系 , 这样 , 更简化了高层次模 块的调用 , 减少模块间的耦合 , 提高系统的灵活性 。
为什么要用责任链模式
这里有一个业务场景 , 在万恶的封建社会 , 女子讲究“三从四德” , “三从”是指“未嫁从父、既嫁从夫、夫死从子” 。