一、责任链模式简介
1. 什么是责任链模式
责任链模式(Chain of Responsibility Pattern) 属于行为型设计模式的一种,其定义如下:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request .Chain the receiving objects and pass the request along the chain until an object handles it (使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间存在耦合关系。当请求者发送请求后会沿着完整的责任链传递,直到有接收者处理为止) 。简单来说,责任链模式就像是一个流水线,每一个接收者处理完请求后就会自发的将请求传递给下一环接收者处理直到所有接收者处理完毕为止。
2. 业务场景
现实生活中我们用到的大多数物品都是通过流水线生产的,比如一辆汽车可能要经过流水线上成百上千的流程才能组装完毕。流水线上的每一环都有各自的任务,他们在完成自己的任务后再将任务传递给下一流程的工作者。就以汽车简单的举例,一辆汽车的生产可能会经过生产车体 -> 安装轮子 -> 安装发动机的流程,我们今天需要做的就是通过代码模拟一条汽车生产流水线。
二、责任链模式的实现
1. 设计思路
在实现代码之前,我们首先要对需求模型做一个简单的分析。第一步我们需要制定一个简单的流水线模型:
接下来我们要做的就是针对流程图分析下我们需要用到的角色:
- 流水线发起者(Client) : 负责生产任务并将任务传递给责任链。
- 流水线环节(Handler):负责将任务请求进行处理,每一个环节虽然处理细节不同,但是都属于流水线上的一环,具备相同的抽象功能。
于是我们可以总结出一个类图:
2. 代码实现
理论准备完事后,让我们看下代码实现:
第一步:创建责任链抽象节点和汽车实体
// 流水线抽象类
public abstract class PipelineHandler {
private PipelineHandler nextHandler;
// 响应
abstract Car echo(Car car);
public final PipelineHandler nextHandler() {
return this.nextHandler;
}
public final Boolean hasNext() {
return this.nextHandler != null;
}
public final Car handleMessage(Car car) {
Car echo = echo(car);
if (hasNext()) {
echo = nextHandler().handleMessage(car);
}
return echo;
}
public void setNextHandler(PipelineHandler nextHandler) {
this.nextHandler = nextHandler;
}
}
// 汽车实体类
public class Car {
private String body;
private String wheel;
private String engine;
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getWheel() {
return wheel;
}
public void setWheel(String wheel) {
this.wheel = wheel;
}
public String getEngine() {
return engine;
}
public void setEngine(String engine) {
this.engine = engine;
}
@Override
public String toString() {
return "Car [车身=" + body + ", 轮子=" + wheel + ", 发动机=" + engine + "]";
}
}
第二步: 创建具体实现类
// 车身流水线
public class BodyHandler extends PipelineHandler {
@Override
Car echo(Car car) {
car.setBody("黑色车身");
return car;
}
}
// 车轮流水线
public class WheelHandler extends PipelineHandler{
@Override
Car echo(Car car) {
car.setWheel("四个轮子");
return car;
}
}
// 发动机流水线
public class EngineHandler extends PipelineHandler {
@Override
Car echo(Car car) {
car.setEngine("v10发动机");
return car;
}
}
第三步:创建客户端并测试
public class Client {
public static void main(String[] args) {
Car car =new Car();
BodyHandler bodyHandler = new BodyHandler();
WheelHandler wheelHandler = new WheelHandler();
EngineHandler engineHandler = new EngineHandler();
bodyHandler.setNextHandler(wheelHandler);
wheelHandler.setNextHandler(engineHandler);
Car handleMessage = bodyHandler.handleMessage(car);
System.out.println(handleMessage.toString());
}
}
测试结果:
到这里一个简单的汽车生产流水线就模拟完成了,如果对这段代码有什么优化意见的小伙伴,欢迎在评论区留言哟。
三、责任链模式总结
1. 责任链模式的特点
优点:
- 请求和处理分开,请求者不需要知道具体的任务处理细节和处理者,两者解除耦合,提高系统灵活性。
缺点:
- 由于链条过长导致的性能问题
2. 责任链模式的使用场景
- 多个对象处理同一请求
- 在不明确处理者的情况下处理请求
四、结语
今天的代理模式讲解就全部结束了,设计模式的相关代码已经在gitee上收录,有需求的小伙伴可以直接拿走:
有疑问的小伙伴欢迎评论区留言或者私信博主,博主会在第一时间为你解答。
码字不易,感到有收获的小伙伴记得要关注博主一键三连,不要当白嫖怪哦~
博主在这里祝大家可以在新的一年升职加薪,走上人生巅峰!