責(zé)任鏈(Chain of Resposibility) 模式
概念
責(zé)任鏈(chain of Resposibility) 模式:為了避免請求發(fā)送者與多個請求處理者耦合在一起,于是將所有請求的處理者 通過前一對象記住其下一個對象的引用而連成一條鏈
;當(dāng)有請求發(fā)生時,可將請求沿著這條鏈傳遞,直到有對象處理它位置。屬于對象行為型模式。
-
抽象處理者(Handler)角色:定義一個處理請求的接口,包含抽象處理方法和一個后繼連接。
-
具體處理者(Concrete Handler)角色:實現(xiàn)抽象處理者的處理方法,判斷能否處理本次請求,如果可以處理請求則處理,否則將請求轉(zhuǎn)給他的后繼者。
-
客戶類(Client)角色:創(chuàng)建處理鏈,并向鏈頭的具體處理者對象提交請求,他不關(guān)心處理細節(jié)和請求的傳遞過程。
代碼
需求1:a1 -> a2 -> a3
實現(xiàn)先a1處理完交給a2,a2處理完再交給a3的邏輯,即: a1 -> a2 -> a3
public class Teacher {
private String name;
public Teacher(String name) {
this.name = name;
}
// 下一個處理的老師;1、鏈條的引用點
private Teacher next;
public Teacher getNext() {
return next;
}
public void setNext(Teacher next) {
this.next = next;
}
void handlerRequest() {
System.out.println(this + "正在處理。。。。。。。。");
// 2、下一個繼續(xù)
if (next != null) {
next.handlerRequest();
}
}
@Override
public String toString() {
return "Teacher{" +
"name='" + name + '\'' +
'}';
}
}
public class MainTest {
public static void main(String[] args) {
Teacher a1 = new Teacher("a1");
Teacher a2 = new Teacher("a2");
Teacher a3 = new Teacher("a3");
// 3、構(gòu)造鏈條
// a1->a2->a2
a1.setNext(a2);
a2.setNext(a3);
a1.handlerRequest();
}
}
測試結(jié)果:
Teacher{name='a1'}正在處理。。。。。。。。
Teacher{name='a2'}正在處理。。。。。。。。
Teacher{name='a3'}正在處理。。。。。。。。
需求2:1->2->3->本人->3->2->1
這個也就是我們學(xué)習(xí)過的Filter了
代碼實現(xiàn):
① Filter 接口
public interface Filter {
void doFilter(Request request,Response response,FilterChain chain);
}
@Data
public class Request {
// 請求內(nèi)容
String msg;
public Request(String msg) {
this.msg = msg;
}
}
@Data
public class Response {
// 響應(yīng)內(nèi)容
private String content;
public Response(String content) {
this.content = content;
}
}
② Filter 的三個實現(xiàn)類
public class HttpFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
// 第一個filter的功能
request.msg += ">>>";
System.out.println("HttpFilter ... doFilter之前");
// 放行
chain.doFilter(request, response, chain);
System.out.println("HttpFilter ... doFilter之后");
}
}
public class CharacterFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
// 功能
request.msg += "====";
System.out.println("CharacterFilter ... doFilter之前");
// 放行
chain.doFilter(request, response, chain);
System.out.println("CharacterFilter ... doFilter之后");
}
}
public class EncodingFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
// 功能
request.msg += "oooo";
System.out.println("EncodingFilter ... doFilter之前");
// 放行
chain.doFilter(request, response, chain);
System.out.println("EncodingFilter ... doFilter之后");
}
}
③ 我們的目標(biāo)方法
public class My {
void hello() {
System.out.println("調(diào)用my.hello()方法");
}
}
```
④ 維護鏈條
```java
/**
* 靠他維護鏈條
* handlerExecutionChain
*
* @author zhuicat
* @since 2023/8/13 8:19
*/
public class FilterChain implements Filter {
// 游標(biāo):記錄當(dāng)前執(zhí)行的步驟
int cursor;
// Filter 的鏈
List<Filter> filterChain = new ArrayList<>();
// 最終要執(zhí)行的目標(biāo)方法
My target;
// 添加 filter 方法
void addFilter(Filter filter) {
filterChain.add(filter);
}
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
// 執(zhí)行第一個 filter ,一次往下
// 游標(biāo)小于總數(shù)量filter一直往下獲取執(zhí)行
if (cursor < filterChain.size()) {
Filter filter = filterChain.get(cursor);
cursor++;
// 執(zhí)行 filter
filter.doFilter(request, response, chain);
} else {
// filter執(zhí)行完了,需要執(zhí)行目標(biāo)方法了
target.hello();
}
}
public My getTarget() {
return target;
}
public void setTarget(My target) {
this.target = target;
}
}
⑤ 主方法
public class MainTest {
public static void main(String[] args) {
FilterChain chain = new FilterChain();
// web.xml
HttpFilter httpFilter = new HttpFilter();
CharacterFilter characterFilter = new CharacterFilter();
EncodingFilter encodingFilter = new EncodingFilter();
chain.addFilter(httpFilter);
chain.addFilter(characterFilter);
chain.addFilter(encodingFilter);
chain.setTarget(new My());
// filter 如何鏈?zhǔn)綀?zhí)行
chain.doFilter(new Request("hello,world"), new Response("dddddddddddddddddd"), chain);
}
}
⑥ 執(zhí)行結(jié)果文章來源:http://www.zghlxwxcb.cn/news/detail-651572.html
HttpFilter ... doFilter之前
CharacterFilter ... doFilter之前
EncodingFilter ... doFilter之前
調(diào)用my.hello()方法
EncodingFilter ... doFilter之后
CharacterFilter ... doFilter之后
HttpFilter ... doFilter之后
完成上述需求文章來源地址http://www.zghlxwxcb.cn/news/detail-651572.html
到了這里,關(guān)于設(shè)計模式之責(zé)任鏈模式【Java實現(xiàn)】的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!