责任链模式
责任链模式简述(Chain of Responsibility)
定义
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将整个对象连成一条链,并沿着这条链传递请求,直到有一个对象处理他为止。
特点
- 链上的每个对象都有机会处理请求
- 链上的每一个对象,都持有下一个要处理对象的引用
- 链上的某个对象无法处理当前请求,那么他会把相同的请求传递给下一个对象
用一张图表示以下使用了责任链模式之后的架构:
graph LR
请求发送者-->请求处理器1
请求处理器1-->请求处理器2
请求处理器2-->请求处理者
也就是说责任链模式满足了请求发送者和请求处理者之间的松耦合,抽象非核心的部分,以链式调用的方式对请求对象进行处理。
使用场景
为完成同一请求,如果存在多个处理器以及不知道请求处理器的个数,或者请求处理器可动态配置的情况下,可以考虑使用责任链模式。
对应的代码实现
- 定义业务执行接口
public interface Handler {
void entry(String req,String resp);
//责任链逻辑
void fireEntry(String req,String resp);
}
- 定义链表元素,其中包含责任链执行逻辑
/**
* @author caoqianqian
* @Description:链表元素,包含责任链的执行逻辑
*/
public abstract class AbstractLinkedProcessHandler implements Handler {
private AbstractLinkedProcessHandler next = null;//默认指向null
public AbstractLinkedProcessHandler getNext() {
return next;
}
public void setNext(AbstractLinkedProcessHandler next){
this.next = next;
}
//责任链的执行逻辑
public void fireEntry(String req, String resp) {
if(next != null){//判断是否到达end
next.entry(req, resp);
}
}
}
- 定义几个链表元素的实现
先刷牙
public class BrushTeeth extends AbstractLinkedProcessHandler {
@Override
public void entry(String req, String resp) {
System.out.println("刷牙");
fireEntry(req, resp);
}
}
再洗脸
public class WashFace extends AbstractLinkedProcessHandler {
@Override
public void entry(String req, String resp) {
System.out.println("洗脸");
fireEntry(req, resp);
}
}
再是睡觉
public class Sleep extends AbstractLinkedProcessHandler {
@Override
public void entry(String req, String resp) {
System.out.println("睡觉");
fireEntry(req, resp);
}
}
- 定义链表插入方法,以抽象类实现,同时继承链表元素的抽象类,目的是在未来的实现中,定义责任链功能调用逻辑
/**
* @author caoqianqian
* @Description:定义链表结构的头部插入和尾部插入
*/
public abstract class ProcessHandlerChain extends AbstractLinkedProcessHandler{
public abstract void addFirst(AbstractLinkedProcessHandler processHandler);
public abstract void addEnd(AbstractLinkedProcessHandler processHandler);
}
- 定义链表的生成逻辑、责任链调用逻辑入口
/**
* @author caoqianqian
* @Description:定义链表的生成逻辑 责任链调用逻辑入口
*/
public class DefaultProcessHandlerChain extends ProcessHandlerChain {
private AbstractLinkedProcessHandler first = new AbstractLinkedProcessHandler() {
@Override
public void entry(String req, String resp) {
super.fireEntry(req, resp);
}
};
private AbstractLinkedProcessHandler end = first;
@Override
public void addFirst(AbstractLinkedProcessHandler processHandler) {
processHandler.setNext(first.getNext());
first.setNext(processHandler);
if(end == first){
end = processHandler;
}
}
@Override
public void addEnd(AbstractLinkedProcessHandler processHandler) {
end.setNext(processHandler);
end = processHandler;
}
//责任链调用逻辑入口
@Override
public void entry(String req, String resp) {
first.entry(req, resp);//指向AbstractLinkedProcessHandler的实现
}
}
- 写测试类
public class ChainTest {
public static void main(String[] args) {
ProcessHandlerChain chain = new DefaultProcessHandlerChain();
//责任链顺序先刷牙再洗脸最后睡觉
chain.addEnd(new BrushTeeth());
chain.addEnd(new WashFace());
chain.addEnd(new Sleep());
chain.entry("request","response");
}
}
- 测试结果如下
刷牙
洗脸
睡觉
Process finished with exit code 0
好了,责任链模式暂时就先介绍到这里了,有问题欢迎在评论区留言呐。