责任链模式
责任链模式
定义: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.(使多个对象都有机会处理请求,从而避免了请求的发送者接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有对象处理它为止。)
责任链模式的通用类图如下图:
"责任链模式类图")
责任链模式的应用
1.责任链模式的优点
责任链模式非常显著的优点是将请求和处理分开。请求者可以不用知道谁处理的,处理者可以不用知道请求的全貌,两者解耦,提高系统的灵活性。
2.责任链模式的缺点
责任链模式有两个非常显著的缺点:一是性能问题,每个请求都是从链头到链尾,特别是在链比较长的时候,性能是一个非常大的问题。二是调试不很方便,特别是链条比较长,环节比较多的时候,由于采用了类似递归的方式,调试的时候逻辑可能比较复杂。
3.责任链模式的注意事项
链中节点数量需要控制,避免出现超长链的情况,一般的做法是在Handler中设置一个最大节点数量,在SetNext方法中判断是否是否是超过其阀值,超过则不允许该链建立,避免无意识地破坏系统性能。
代码示例:
CORTest
public class CORTest {
public static void main(String[] args) {
FilterChain chain = new FilterChainOne();
chain.addFilter(new FilterOne());
chain.addFilter(new FilterTwo());
chain.addFilter(new FilterThree());
chain.doFilter(new HTRequest(), new HTResponse());
}
}
Filter
public interface Filter {
void doFilter(HTRequest request, HTResponse response, FilterChain chain);
}
FilterChain
public interface FilterChain {
void doFilter(HTRequest request, HTResponse response);
void addFilter(Filter filter);
}
FilterChainOne
public class FilterChainOne implements FilterChain {
public List<Filter> filters;
private int index;
public FilterChainOne() {
init();
}
private void init() {
this.filters = new ArrayList<>();
this.index = 0;
}
@Override
public void doFilter(HTRequest request, HTResponse response) {
if (filters == null || index == filters.size()) {
return;
}
filters.get(index++).doFilter(request, response, this);
}
@Override
public void addFilter(Filter filter) {
this.filters.add(filter);
}
}
FilterOne
public class FilterOne implements Filter {
@Override
public void doFilter(HTRequest request, HTResponse response, FilterChain chain) {
System.out.println("FilterOne.doFilter: before");
chain.doFilter(request, response);
System.out.println("FilterOne.doFilter: after");
}
}
FilterThree
public class FilterThree implements Filter{
@Override
public void doFilter(HTRequest request, HTResponse response, FilterChain chain) {
System.out.println("FilterThree.doFilter: before");
chain.doFilter(request, response);
System.out.println("FilterThree.doFilter: after");
}
}
FilterTwo
public class FilterTwo implements Filter{
@Override
public void doFilter(HTRequest request, HTResponse response, FilterChain chain) {
System.out.println("FilterTwo.doFilter: before");
chain.doFilter(request, response);
System.out.println("FilterTwo.doFilter: after");
}
}
HTRequest
public class HTRequest {
}
HTResponse
public class HTResponse {
}
运行结果:
FilterOne.doFilter: before
FilterTwo.doFilter: before
FilterThree.doFilter: before
FilterThree.doFilter: after
FilterTwo.doFilter: after
FilterOne.doFilter: after
保持微笑,时刻冷静,相信自己也相信队友,坚持信念
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2022-04-24 Java在循环中中使用lambda需要注意项