1.定义
责任链模式(Chain of Responsibility)也称为职责链模式,它使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。即构造一系列分别担当不同的职责的类的对象来共同完成一个任务。
2.结构
2.1 UML类图
2.2 角色
- Handler 处理类的抽象父类,定义了一个处理请求的方法。所有的处理者都必须实现该抽象类。
- Concrete Handler 具体的处理类,处理它所负责的请求,同时也可以访问它的后继者。
3.实现
class Request {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
abstract class Handler {
protected Handler handler;
protected void setHandler(Handler handler) {
this.handler = handler;
}
protected abstract void handleRequest(Request request);
}
class Manager extends Handler {
@Override
protected void handleRequest(Request request) {
System.out.println(request.getName() + " 经理审批中...");
if (this.handler != null) {
this.handler.handleRequest(request);
}
}
}
class Director extends Handler {
@Override
protected void handleRequest(Request request) {
System.out.println(request.getName() + " 主管审批中...");
if (this.handler != null) {
this.handler.handleRequest(request);
}
}
}
class President extends Handler {
@Override
protected void handleRequest(Request request) {
System.out.println(request.getName() + " 总监审批中...");
if (this.handler != null) {
this.handler.handleRequest(request);
}
}
}
public class ChainOfResponsibilityDemo {
public static void main(String[] args) {
Manager manager = new Manager();
Director director = new Director();
President president = new President();
manager.setHandler(director);
director.setHandler(president);
Request request = new Request();
request.setName("员工小王请假");
manager.handleRequest(request);
}
}
4.总结
4.1 优点
- 降低耦合度:每个类只需要处理自己该处理的工作(不该处理的传递给下一个对象完成),明确各类的责任范围,符合类的最小封装原则。可根据需要自由组合工作流程。类与类之间可以以松耦合的形式加以组织。
- 便于增加新的请求处理类,而不需要修改代码,符合开闭原则。
4.2 缺点
- 处理时以链的形式在对象之间传递消息,根据实现方式不同,有可能影响处理的速度。
- 可能会造成循环调用。
4.3 应用场景
- 有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
- 在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
本人才疏学浅,若有错,请指出,谢谢!
如果你有更好的建议,可以留言我们一起讨论,共同进步!
衷心的感谢您能耐心的读完本篇博文!