目錄
前言
一、責任鏈模式的簡介
二、責任鏈模式的概念
三、責任鏈模式的作用
四、責任鏈模式的優(yōu)、缺點
1.責任鏈模式的優(yōu)點
2.責任鏈模式的缺點
五、責任鏈模式的應用場景
六、代碼案例
UML類圖
?1.定義一個請求枚舉類
?2.定義一個請求類
3.定義一個抽象處理接口
4、定義具體處理類
5.Main代碼測試
總結(jié)
前言
使用責任鏈模式,它可以動態(tài)地添加或刪除處理器,從而改變處理請求的順序和方式。同時,責任鏈模式也可以減少對象之間的耦合度,提高代碼的可擴展性和可維護性。
一、責任鏈模式的簡介
責任鏈模式(Chin of Responsibility)是一種行為型設(shè)計模式,它通過將請求的發(fā)送者和接收者解耦來實現(xiàn)請求的處理。
二、責任鏈模式的概念
責任鏈模式(Chin of Responsibility):使多個對象都有機會處理請求,從而避免請求的發(fā)送者和接受者之間的耦合關(guān)系。將這個對象連成一條鏈子,并沿著這條鏈傳遞該請求,直到有一對象處理到它為止。
三、責任鏈模式的作用
責任鏈模式(Chin of Responsibility)的作用是將請求的發(fā)送者和接收者解耦,使多個對象都有機會處理該請求。它將這些對象連接成一條鏈,并沿著鏈傳遞請求,直到有一個對象處理它為止。
責任鏈模式的主要作用包括以下:
- 降低系統(tǒng)的耦合度
- 增強系統(tǒng)的靈活性
- 提高代碼的可擴展性
- 提高代碼的可維護性
四、責任鏈模式的優(yōu)、缺點
1.責任鏈模式的優(yōu)點
- 降低系統(tǒng)的耦合度:請求發(fā)送者和接收者之間不直接交互,而是通過責任鏈上的多個對象進行交互,從而降低了它們之間的耦合度。
- 增強系統(tǒng)的靈活性:可以動態(tài)地增加或刪除處理器,從而改變請求的處理順序和方式。
- 提高代碼的可擴展性:因為每個處理器都只負責處理自己能夠處理的請求,所以可以方便地添加新的處理器來處理新的請求類型。
- 提高代碼的可維護性:因為每個處理器都只負責處理自己能夠處理的請求,所以可以方便地添加新的處理器來處理新的請求類型。
2.責任鏈模式的缺點
- 請求可能沒有被處理:如果沒有任何一個處理器能夠處理該請求,則該請求將被忽略。
- 系統(tǒng)性能可能受影響:由于責任鏈中可能包含大量的處理器,因此可能會影響系統(tǒng)的性能。
五、責任鏈模式的應用場景
責任鏈的使用場景有以下幾點:
- 處理請求需要多個對象協(xié)作,且不確定哪個對象能夠處理請求。
- 需要動態(tài)指定能夠處理請求的對象集合。
- 需要在不明確接收者的情況下,向多個對象中的一個或多個發(fā)送請求。
- 可以通過在運行時添加或刪除處理器來改變請求處理的順序。
- 當一個請求需要被多個對象進行處理時,可以使用責任鏈模式避免產(chǎn)生復雜的嵌套調(diào)用。
- 可以將責任鏈模式與其他設(shè)計模式結(jié)合使用,如裝飾器模式、工廠模式等,以實現(xiàn)更加靈活的功能。
六、代碼案例
UML類圖
?1.定義一個請求枚舉類
RequestType請求枚舉
/***
* 定義請求枚舉
*/
public enum RequestType {
TYPE_A, TYPE_B, TYPE_C
}
?2.定義一個請求類
Request請求類
/***
* 定義請求類
*/
public class Request {
private String name;
private RequestType type;
public Request(String name, RequestType type) {
this.name = name;
this.type = type;
}
public String getName() {
return name;
}
public RequestType getType() {
return type;
}
}
3.定義一個抽象處理接口
定義一個抽象處理器(Handler)類,其中包含一個指向下一個處理器的引用,并定義一個處理請求的方法。
Handler抽象類
/***
* 定義一個抽象處理器(Handler)類,其中包含一個指向下一個處理器的引用,并定義一個處理請求的方法。
*/
public abstract class Handler {
protected Handler successor;
public void setSuccessor(Handler successor) {
this.successor = successor;
}
public abstract void handleRequest(Request request);
}
4、定義具體處理類
ConcreteHandlerA類
/***
* 定義具體處理類
*/
public class ConcreteHandlerA extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType().equals(RequestType.TYPE_A)) {
System.out.println("ConcreteHandlerA處理請求" +request.getName());
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
ConcreteHandlerB類
/***
* 定義具體處理類
*/
public class ConcreteHandlerB extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType().equals(RequestType.TYPE_B)) {
System.out.println("ConcreteHandlerB處理請求" + request.getName());
} else if (successor != null) {
successor.handleRequest(request);
}
}
ConcreteHandlerC類
/***
* 定義具體處理類
*/
public class ConcreteHandlerC extends Handler {
@Override
public void handleRequest(Request request) {
if (request.getType().equals(RequestType.TYPE_C)) {
System.out.println("ConcreteHandlerC處理請求" + request.getName());
} else if (successor != null) {
successor.handleRequest(request);
}
}
}
5.Main代碼測試
public static void main(String[] args) {
Handler handlerA = new ConcreteHandlerA();
Handler handlerB = new ConcreteHandlerB();
Handler handlerC = new ConcreteHandlerC();
handlerA.setSuccessor(handlerB);
handlerB.setSuccessor(handlerC);
Request request1 = new Request("已處理 1", RequestType.TYPE_A);
Request request2 = new Request("已處理 2", RequestType.TYPE_B);
Request request3 = new Request("已處理 3", RequestType.TYPE_C);
handlerA.handleRequest(request1);
handlerA.handleRequest(request2);
handlerA.handleRequest(request3);
}
輸出結(jié)果:
?文章來源:http://www.zghlxwxcb.cn/news/detail-480470.html
總結(jié)
這個示例中,具體處理器類實現(xiàn)了抽象處理器接口,并根據(jù)自己的能力來判斷是否能夠處理請求。如果不能處理,則將請求傳遞給下一個處理器。客戶端創(chuàng)建責任鏈并將請求發(fā)送給第一個處理器,處理器依次處理請求,直到有一個處理器能夠處理它為止。文章來源地址http://www.zghlxwxcb.cn/news/detail-480470.html
到了這里,關(guān)于Java設(shè)計模式—責任鏈模式(Chin of Responsibility)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!