责任链模式
- 一、什么是责任链模式
- 二、责任链模式的优势和劣势
- 2.1 优势
- 2.2 劣势
- 三、示例
一、什么是责任链模式
责任链模式定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
可以将它想象成一个管道,请求会顺着管道一段一段被传递,直到被处理。
二、责任链模式的优势和劣势
2.1 优势
- 解耦
- 扩展性高
- 简化链接
- 分担责任
2.2 劣势
- 可能请求到最末端也未得到处理
- 链中程序过多会影响性能
- 增加了客户端的复杂度
三、示例
我们来一段代码展示一下:
首先我们定义一个抽象类,这个类中定义我们要实现的逻辑的抽象实现和传输逻辑:
public abstract class Handler {//用它打印日志private static final Logger log = LoggerFactory.getLogger(Handler.class);//定义一个要传递的参数private final int num;//参数获取Handler(int num) {this.num = num;}private Handler nextHandler;//链接public void setNextHandler(Handler nextHandler) {this.nextHandler = nextHandler;}public final void submit(int i) {if (i == num) {//调用处理方法this.handleLeave(i);//不往下传递请求时打印这个log.info("流程结束!!!");}else if(this.nextHandler == null) {//到最末端仍未处理请求打印这个log.info("责任链中没有处理该数字的程序");}else{this.nextHandler.submit(i);}}protected abstract void handleLeave(int i);}
接着定义三个实现类,实现抽象类中的方法:
实现类 One:
public class One extends Handler{private static final Logger oneLog = LoggerFactory.getLogger(One.class);public One() {super(1);}@Overrideprotected void handleLeave(int leave) {//One 执行的逻辑oneLog.info("打印数字 1");}
}
实现类 Two:
public class Two extends Handler {private static final Logger TwoLog = LoggerFactory.getLogger(Two.class);public Two() {super(2);}@Overrideprotected void handleLeave(int leave) {//Two 执行的逻辑TwoLog.info("打印数字 2");}
}
实现 Three:
public class Three extends Handler {private static final Logger ThreeLog = LoggerFactory.getLogger(Three.class);public Three() {super(3);}@Overrideprotected void handleLeave(int leave) {//Three 执行的逻辑ThreeLog.info("打印数字 3");}
}
最后写一个客户端测试一下:
public class Client {public static void main(String[] args) {// 处理 3Three three = new Three();// 处理 2Two two = new Two();// 处理 1One one = new One();three.setNextHandler(two);two.setNextHandler(one);//提交three.submit(1);three.submit(2);three.submit(3);}
}
运行结果:
可以看到 One、Two、Three三个实现程序各司其职~