責任鏈模式:將能夠處理同一類請求的對象連成一條鏈,如果不能處理則傳遞給鏈上的下一個對象。
//請假對象 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);
}
}