java设计模式--责任链模式
责任链模式:将能够处理同一类请求的对象连成一条链,如果不能处理则传递给链上的下一个对象。
//请假对象 public class QingjiaRequest { private String name; private int days; private String reason; public QingjiaRequest(String name, int days, String reason) { this.name = name; this.days = days; this.reason = reason; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getDays() { return days; } public void setDays(int days) { this.days = days; } public String getReason() { return reason; } public void setReason(String reason) { this.reason = reason; } }
//抽象类 public abstract class Leader { String name; Leader nextLeader; public Leader(String name) { this.name = name; } public void setNextLeader(Leader nextLeader) { this.nextLeader = nextLeader; } //设置责任链的处理对象(核心) public abstract void handleRequest(QingjiaRequest qingjiaRequest); }
//主任 public class Zhuren extends Leader{ public Zhuren(String name){ super(name); } public void handleRequest(QingjiaRequest qingjiaRequest) { if(qingjiaRequest.getDays()<3){ System.out.println("员工请假小于3天"); System.out.println("审批通过"); }else{ if(this.nextLeader!=null){ this.nextLeader.handleRequest(qingjiaRequest); } } } }
//经理 public class Manager extends Leader{ public Manager(String name){ super(name); } public void handleRequest(QingjiaRequest qingjiaRequest) { if(qingjiaRequest.getDays()<10&&qingjiaRequest.getDays()>3){ System.out.println("经理审批通过"); }else{ //经理处理后的逻辑 } } }
public static void main(String[] args) { QingjiaRequest qingjiaRequest = new QingjiaRequest("张三", 2, "请假"); //QingjiaRequest qingjiaRequest1 = new QingjiaRequest("张三", 5, "请假"); Leader a = new Zhuren("张主任"); Leader b = new Manager("王经理");
//可以用一个容器对象责任链对象进行一些封装 a.setNextLeader(b); //开始请假 a.handleRequest(qingjiaRequest); }
应用场景:try catch,javascript 冒泡,servlet filter,struts2 拦截器
模仿 JavaWeb 中的 Filter,可以对其思路有个很好的把握
1.Filter
package com.cun.filters;
import com.cun.main.FilterChain;
import com.cun.main.Request;
import com.cun.main.Response;
public interface Filter {
void doFilter(Request request, Response response, FilterChain chain);
}
2.FirstFilter
package com.cun.filters;
import com.cun.main.FilterChain;
import com.cun.main.Request;
import com.cun.main.Response;
public class FirstFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
request.doSomething(this.getClass().getName());
// 先执行所有request再倒序执行所有response
chain.doFilter(request, response, chain);
response.doSomething(this.getClass().getName());
}
}
3.SecondFilter
package com.cun.filters;
import com.cun.main.FilterChain;
import com.cun.main.Request;
import com.cun.main.Response;
public class SecondFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
request.doSomething(this.getClass().getName());
chain.doFilter(request, response, chain);
response.doSomething(this.getClass().getName());
}
}
3.ThirdFilter
package com.cun.filters;
import com.cun.main.FilterChain;
import com.cun.main.Request;
import com.cun.main.Response;
public class ThirdFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
request.doSomething(this.getClass().getName());
chain.doFilter(request, response, chain);
response.doSomething(this.getClass().getName());
}
}
4.Request
package com.cun.main;
public class Request {
public void doSomething(String str) {
System.out.println("Request ---> " + str);
}
}
5.Response
package com.cun.main;
public class Response {
public void doSomething(String str) {
System.out.println("Response ---> " + str);
}
}
6.FilterChain
package com.cun.main;
import com.cun.filters.Filter;
import java.util.ArrayList;
import java.util.List;
public class FilterChain implements Filter {
private List<Filter> filters = new ArrayList<Filter>();
private int index = 0;
// 链式调用
public FilterChain addFilter(Filter filter) {
this.filters.add(filter);
return this;
}
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
if (index == filters.size()) {
return;
}
Filter filter = filters.get(index);
index++;
filter.doFilter(request, response, chain);
}
}
7.FilterTest 测试
package com.cun.main;
import com.cun.filters.FirstFilter;
import com.cun.filters.SecondFilter;
import com.cun.filters.ThirdFilter;
import org.junit.Test;
public class FilterTest {
@Test
public void Test(){
FilterChain filterChain = new FilterChain();
filterChain.addFilter(new FirstFilter()).addFilter(new SecondFilter()).addFilter(new ThirdFilter());
filterChain.doFilter(new Request(),new Response(),filterChain);
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义