职责链模式规定了一个请求,这个请求需要特定的对象去处理,当把这个请求交个一个对象,但是这个对象不负责处理这个请求,可以动态地交给其他对象处理,直到交给对的对象处理,这些对象都有处理请求的机会,只有当请求是该自己负责的时候才处理,否则交给其他对象。
下面以==============
要离职, 人事审批!
请求完毕
===========
要加薪, 项目经理审批!
========
要请假, 项目组长审批!
的规定,写一个职责链模式的例子:
这是所有请求的接口
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);
}
}
在使用时要调用最高级的职责调用者,由他去负责往下分配职责