责任链模式,将一次请求任务,分发给多个请求者的一条链,使用这种设计方式,可以将接收者和发送者进行解耦。
优点:
- 降低耦合,解耦发送者和接收者。
- 简化对象,对象不需要知道链中其他对象。
- 增加新的请求处理类很方便。
缺点 - 影响性能,可能造成循环调用
- 不利于排错
- 发送者的请求不一定被接受者接收
下面举个栗子:
当项目经理提了个需求给工程师,工程师做不来,上报个技术总监。总监觉得需求不可能实现,上报个事业部经理的责任流程。
1、 首先定义抽象类Handler
,表示工程师,总监,经理都可以处理工作和上报工作。
public abstract class Handler {
protected Handler nextHandler;
public void setNextHandler(Handler nextHandler) {
this.nextHandler = nextHandler;
}
public abstract void handle();
public void report(){
if (nextHandler!=null){
nextHandler.handle();
}
}
}
2 、 定义工程师,总监,经理
public class Developer extends Handler {
@Override
public void handle() {
System.out.println("软件工程师:这个需求我实现不了,需要上报个上级");
nextHandler.handle();
}
}
public class Director extends Handler {
@Override
public void handle() {
System.out.println("总监:这个需求技术实现不了,上报总经理吧");
nextHandler.handle();
}
}
public class Manager extends Handler {
@Override
public void handle() {
System.out.println("经理:技术实现不了,就换个需求,或者换种模式,处理事情要灵活点,你们三在好好沟通下");
}
}
从代码来看,当自己处理不了工作时,上报给上级。
3、 运行
public class Main {
public static void main(String[] args) {
Developer developer=new Developer();
Director director=new Director();
Manager manager=new Manager();
developer.setNextHandler(director);
director.setNextHandler(manager);
developer.handle();
}
}
运行结果
软件工程师:这个需求我实现不了,需要上报个上级
总监:这个需求技术实现不了,上报总经理吧
经理:技术实现不了,就换个需求,或者换种模式,处理事情要灵活点,你们三在好好沟通下
从第三步就可以看出责任链模式的优缺点。当工程师可以处理事情,总监和经理就是接收不到请求,这里有新建对象,造成性能问题。在处理事情,如果handle
方法复杂,是否调用下一个责任链,这样的排错也比较困难。
网友评论