先上出概念圖:
圖中主要是2個接口 :
MyExecutor: 主要包含執行方法(可以理解未一個處理請求的方法,擴展時請求可以定義爲一個對象)
MyExecutorChain: 主要包含新增 執行器方法 和 另一個執行方法(遍歷執行器去調用執行器的執行方法)
MyDefaultExecutorChain: 主要是一個 鏈表集合LinkedList(包含了多個執行器) + 一個索引(也可以理解爲遊標: 用於標識當前處理請求的執行器)
具體內容如下: 內部還有多個點有問題: 僅僅作爲理解責任鏈模式的一個demo:
public interface MyExecutor {
/**
* 處理請求方法
*/
int run(MyExecutorChain myExecutorChain);
}
public interface MyExecutorChain<T> {
MyExecutorChain add(MyExecutor myExecutor);
/**
* 添加處理對象: 返回處理請求結果
* 0 : 表示成功
* 1 : 表示失敗
* 2 : 表示沒有結果
*/
int exec(T request);
}
public class Request {
private String requestStr;
}
public class WorldMyDefaultExecutorChain extends AbstractExecutor {
public WorldMyDefaultExecutorChain(Request request) {
super(request);
}
@Override
public int run(MyExecutorChain myExecutorChain) {
System.out.println(" World (項目經理) 接收請求: " + request.toString());
System.out.println(" World (項目經理) 處理請求: " + request.toString());
if(request.toString().contains("原因")) {
return myExecutorChain.exec(request);
} else {
System.out.println("World (項目經理) 處理結果: " + "請假未寫明原因,請寫清楚請假原因.");
return 1;
}
}
}
public class LandyMyDefaultExecutorChain extends AbstractExecutor {
public LandyMyDefaultExecutorChain(Request request) {
super(request);
}
@Override
public int run(MyExecutorChain myExecutorChain) {
//處理邏輯
System.out.println(" Landy(組長) 接收請求: " + request.toString());
System.out.println(" Landy(組長) 處理請求: " + request.toString());
//如果同意的話就繼續往下傳遞: 3天時間超過權限
if(request.toString().contains("三")) {
System.out.println("Landy(組長) 處理結果: " + "請假時間超過權限,轉到項目經理.");
return myExecutorChain.exec(super.request);
} else {
return 1;
}
}
}
public abstract class AbstractExecutor implements MyExecutor {
//使用protected 限制訪問範圍 : 同時不用提供外部訪問方法: 因爲只需要將該對象在鏈路上傳遞就可以l
protected Request request;
public AbstractExecutor(Request request) {
this.request = request;
}
}
public class Test {
public static void main(String[] args) {
Request request = new Request();
request.setRequestStr("我想請假,三天,請批准..............");
Request request1 = new Request();
request1.setRequestStr("我想請假,兩天,請批准..............原因是: 想請假.....");
MyDefaultExecutorChain chain = new MyDefaultExecutorChain();
LandyMyDefaultExecutorChain landyMyDefaultExecutorChain = new LandyMyDefaultExecutorChain(request);
WorldMyDefaultExecutorChain worldMyDefaultExecutorChain = new WorldMyDefaultExecutorChain(request);
chain.add(landyMyDefaultExecutorChain);
chain.add(worldMyDefaultExecutorChain);
int result = chain.exec(request);
System.out.println("最終處理結果.......................如下................");
if(result == 0) {
System.out.println("請求處理成功!");
}
if(result == 1) {
System.out.println("請求被拒絕!");
} else {
System.out.println("請求處理沒有結果,請重新發起申請!");
}
}
}
最後上出責任鏈模式的基本概念:
責任鏈模式(Chain of Responsibility Pattern)是一種常見的行爲模式。
責任鏈模式英文原話是:Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving object and pass the request along the chain until an object handles it.
翻譯:使多個對象都有處理請求的機會,從而避免了請求的發送者和接收者之間的耦合關係。將這些對象串成一條鏈,並沿着這條鏈一直傳遞該請求,直到有對象處理它爲止。
責任鏈模式的重點在“鏈上”,由一條鏈去處理相似的請求,在鏈中決定誰來處理這個請求,並返回相應的結果。
角色:
抽象處理者(Handler)角色:該角色對請求進行抽象,並定義一個方法來設定和返回對下一個處理者的引用。
具體處理者(Concrete Handler):該角色接到請求後,可以選擇將請求處理掉,或者將請求傳給下一個處理者。由於具體處理者持有對下一個處理者的引用,因此,如果需要,處理者可以訪問下一個處理者。
內容暫時如上, 不足的地方還在改正!
下一節上一個具體的一個用例子!