職責鏈模式規定了一個請求,這個請求需要特定的對象去處理,當把這個請求交個一個對象,但是這個對象不負責處理這個請求,可以動態地交給其他對象處理,直到交給對的對象處理,這些對象都有處理請求的機會,只有當請求是該自己負責的時候才處理,否則交給其他對象。
下面以==============
要離職, 人事審批!
請求完畢
===========
要加薪, 項目經理審批!
========
要請假, 項目組長審批!
的規定,寫一個職責鏈模式的例子:
這是所有請求的接口
public interface Request {
void getRequest();
}
請假的請求實現類
public class LeaveRequest implements Request{
@Override
public void getRequest() {
System.out.println("leave");
}
}
離職的請求實現類
public class DimissionRequest implements Request{
@Override
public void getRequest() {
System.out.println("dimission");
}
}
加薪的請求實現類
public class AddMoneyRequest implements Request{
@Override
public void getRequest() {
System.out.println("add money");
}
}
處理請求的接口
public interface RequestHandle {
void handleRequest(Request request);
}
Hr處理離職的請求
public class HRRequestHandle implements RequestHandle{
public void handleRequest(Request request) {
if (request instanceof DimissionRequest) {
System.out.println("要離職, 人事審批!");
}
System.out.println("請求完畢");
}
}
組長處理請假的請求
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);
}
}
}
經理處理加薪的請求
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);
}
}
}
測試類
public class Test {
public static void main(String[] args) {
//先把所有的處理請求的對象組成職責鏈
RequestHandle hr = new HRRequestHandle();
RequestHandle tl = new TLRequestHandle(hr);//組長
RequestHandle pm = new PMRequestHandle(tl);//經理
Request dimissionRequest = new DimissionRequest();
Request addMoneyRequest = new AddMoneyRequest();
Request leaveRequest = new LeaveRequest();
System.out.println("==============");
//人事處理離職請求
pm.handleRequest(dimissionRequest);
System.out.println("===========");
//經理處理加薪請求
pm.handleRequest(addMoneyRequest);
System.out.println("========");
//項目組長處理請假請求
pm.handleRequest(leaveRequest);
}
}
在使用時要調用最高級的職責調用者,由他去負責往下分配職責