淺談JAVA設計模式之——責任鏈模式(COR)
阿新 • • 發佈:2019-02-20
一、概述
使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈, 並沿著這條鏈傳遞該請求,直到有一個物件處理它為止。 這一模式的想法是,給多個物件處理一個請求的機會,從而解耦傳送者和接受者.
二、適用性
1.有多個的物件可以處理一個請求,哪個物件處理該請求執行時刻自動確定。
2.你想在不明確指定接收者的情況下,向多個物件中的一個提交一個請求。
3.可處理一個請求的物件集合應被動態指定。
三、參與者
1.Handler 定義一個處理請求的介面。 (可選)實現後繼鏈。
2.ConcreteHandler 處理它所負責的請求。 可訪問它的後繼者。 如果可處理該請求,就處理之;否則將該請求轉發給它的後繼者。
3.Client 向鏈上的具體處理者(ConcreteHandler)物件提交請求。
四、類圖
五、示例
Handler
package com.lyz.design.cor;
import org.omg.CORBA.Request;
/**
* Handler
* @author liuyazhuang
*
*/
public interface RequestHandle {
void handleRequest(Request request);
}
ConcreteHandler
package com.lyz.design.cor; import org.omg.CORBA.Request; /** * ConcreteHandler * @author liuyazhuang * */ public class HRRequestHandle implements RequestHandle { public void handleRequest(Request request) { if (request instanceof DimissionRequest) { System.out.println("要離職, 人事審批!"); } System.out.println("請求完畢"); } }
package com.lyz.design.cor; /** * ConcreteHandler * @author liuyazhuang * */ public class PMRequestHandle implements RequestHandle { RequestHandle rh; public PMRequestHandle(RequestHandle rh) { this.rh = rh; } public void handleRequest(Request request) { if (request instanceof AddMoneyRequest) { System.out.println("要加薪, 專案經理審批!"); } else { rh.handleRequest(request); } } }
package com.lyz.design.cor;
/**
* ConcreteHandler
* @author liuyazhuang
*
*/
public class TLRequestHandle implements RequestHandle {
RequestHandle rh;
public TLRequestHandle(RequestHandle rh) {
this.rh = rh;
}
public void handleRequest(Request request) {
if (request instanceof LeaveRequest) {
System.out.println("要請假, 專案組長審批!");
} else {
rh.handleRequest(request);
}
}
}
Test
package com.lyz.design.cor;
import org.omg.CORBA.Request;
/**
* Test
* @author liuyazhuang
*
*/
public class Test {
public static void main(String[] args) {
RequestHandle hr = new HRRequestHandle();
RequestHandle pm = new PMRequestHandle(hr);
RequestHandle tl = new TLRequestHandle(pm);
//team leader處理離職請求
Request request = new Request();
tl.handleRequest(request);
System.out.println("===========");
//team leader處理加薪請求
request = new AddMoneyRequest();
tl.handleRequest(request);
System.out.println("========");
//專案經理上理辭職請求
request = new DimissionRequest();
pm.handleRequest(request);
}
}
Result
要離職, 人事審批!
請求完畢
===========
要加薪, 專案經理審批!
========
要離職, 人事審批!
請求完畢