責(zé)任鏈模式
- 責(zé)任鏈模式(Chain of Responsibility Pattern)
- 責(zé)任鏈模式將鏈中每一個(gè)節(jié)點(diǎn)都看作一個(gè)對(duì)象谭跨,每個(gè)節(jié)點(diǎn)處理的請(qǐng)求均不同孕暇,且內(nèi)部自動(dòng)維護(hù)下一個(gè)節(jié)點(diǎn)對(duì)象澈侠。
- 當(dāng)一個(gè)請(qǐng)求從鏈?zhǔn)降氖锥税l(fā)出時(shí)菩鲜,會(huì)沿著責(zé)任鏈預(yù)設(shè)的路徑依次傳遞到每一個(gè)節(jié)點(diǎn)對(duì)象罩引,直至被鏈中的某個(gè)對(duì)象處理為止
優(yōu)點(diǎn):職責(zé)鏈模式使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求嘹悼,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系
1.2 兩個(gè)角色
(1)抽象處理者(Handler):定義處理請(qǐng)求的方法嵌器,并維護(hù)一個(gè)下一處理節(jié)點(diǎn)Handler對(duì)象的引用
(2)具體處理者(ConcreteHandler):對(duì)請(qǐng)求進(jìn)行處理肛真,如果不感興趣,則進(jìn)行轉(zhuǎn)發(fā)
2. 示例
用戶的請(qǐng)求傳遞爽航,直到可以解決這個(gè)請(qǐng)求為止
image.png
public abstract class AbstractHandler {
protected AbstractHandler successor;
/**
* 設(shè)置繼任者
*/
public void setSuccessor(AbstractHandler successor) {
this.successor = successor;
}
protected abstract void doHandle(String request);
}
public class ConcreteHandlerA extends AbstractHandler {
@Override
protected void doHandle(String request) {
if (request.startsWith("handlerA")) {
System.out.println("ConcreteHandlerA execute: " + request);
} else {
// 請(qǐng)求向下傳遞
successor.doHandle(request);
}
}
}
public class ConcreteHandlerB extends AbstractHandler {
@Override
public void doHandle(String request) {
if (request.startsWith("handlerB")) {
System.out.println("ConcreteHandlerB execute: " + request);
} else {
successor.doHandle(request);
}
}
}
public class ConcreteHandlerC extends AbstractHandler {
@Override
protected void doHandle(String request) {
if (request.startsWith("handlerC")) {
System.out.println("ConcreteHandlerC execute: " + request);
} else {
successor.doHandle(request);
}
}
}
測(cè)試:
@Test
public void test() {
AbstractHandler handlerA = new ConcreteHandlerA();
AbstractHandler handlerB = new ConcreteHandlerB();
AbstractHandler handlerC = new ConcreteHandlerC();
handlerA.setSuccessor(handlerB);
handlerB.setSuccessor(handlerC);
List<String> list = Arrays.asList("handlerA000", "handlerB111", "handlerC222");
for (String str : list) {
handlerA.doHandle(str);
}
}
``
## 3. 其他
```java
public abstract class AbstractHandle {
public static void main(String[] args) {
AbstractHandle handle = Builder.create()
.addHandler(new ValidateHandle())
.addHandler(new LoginHandle())
.addHandler(new AuthHandle())
.build();
handle.doHandle("111");
}
protected AbstractHandle chain;
public void next(AbstractHandle handle) {
this.chain = handle;
}
/**
* 抽象方法
* @param request
*/
public abstract void doHandle(String request);
public static class Builder {
private AbstractHandle head;
private AbstractHandle tail;
public Builder addHandler(AbstractHandle handle) {
if (this.head == null) {
this.head = this.tail = handle;
return this;
}
this.tail.next(handle);
this.tail = handle;
return this;
}
public AbstractHandle build() {
return this.head;
}
public static Builder create() {
return new Builder();
}
}
}
class ValidateHandle extends AbstractHandle {
@Override
public void doHandle(String request) {
System.out.println("ValidateHandle start");
if (chain != null) {
chain.doHandle(request);
}
}
}
class LoginHandle extends AbstractHandle {
@Override
public void doHandle(String request) {
System.out.println("LoginHandle start");
if (chain != null) {
chain.doHandle(request);
}
}
}
class AuthHandle extends AbstractHandle {
@Override
public void doHandle(String request) {
System.out.println("AuthHandle start");
// 若還有下一級(jí)蚓让,請(qǐng)求繼續(xù)傳遞
if (chain != null) {
chain.doHandle(request);
}
}
}