职责链模式规定了一个请求,这个请求需要特定的对象去处理,当把这个请求交个一个对象,但是这个对象不负责处理这个请求,可以动态地交给其他对象处理,直到交给对的对象处理,这些对象都有处理请求的机会,只有当请求是该自己负责的时候才处理,否则交给其他对象。
下面以==============
要离职, 人事审批!
请求完毕
===========
要加薪, 项目经理审批!
========
要请假, 项目组长审批!
的规定,写一个职责链模式的例子:
这是所有请求的接口
public interfaceRequest {
voidgetRequest();
}
请假的请求实现类
public classLeaveRequestimplementsRequest{
@Override
public voidgetRequest() {
System.out.println("leave");
}
}
离职的请求实现类
public classDimissionRequestimplementsRequest{
@Override
public voidgetRequest() {
System.out.println("dimission");
}
}
加薪的请求实现类
public classAddMoneyRequestimplementsRequest{
@Override
public voidgetRequest() {
System.out.println("add money");
}
}
处理请求的接口
public interface RequestHandle{
voidhandleRequest(Request request);
}
Hr处理离职的请求
public classHRRequestHandleimplementsRequestHandle{
public voidhandleRequest(Request request) {
if(requestinstanceof DimissionRequest) {
System.out.println("要离职, 人事审批!");
}
System.out.println("请求完毕");
}
}
组长处理请假的请求
public classTLRequestHandleimplementsRequestHandle{
RequestHandlerh;
public TLRequestHandle(RequestHandle rh) {
this.rh= rh;
}
public voidhandleRequest(Request request) {
if(requestinstanceofLeaveRequest) {
System.out.println("要请假, 项目组长审批!");
}else{
rh.handleRequest(request);
}
}
}
经理处理加薪的请求
public classPMRequestHandleimplementsRequestHandle{
RequestHandlerh;
publicPMRequestHandle(RequestHandle rh) {
this.rh= rh;
}
public voidhandleRequest(Requestrequest) {
if(request instanceofAddMoneyRequest) {
System.out.println("要加薪, 项目经理审批!");
}else{
rh.handleRequest(request);
}
}
}
测试类
public classTest {
public static voidmain(String[] args) {
//先把所有的处理请求的对象组成职责链
RequestHandle hr =newHRRequestHandle();
RequestHandle tl =newTLRequestHandle(hr);//组长
RequestHandle pm =newPMRequestHandle(tl);//经理
Request dimissionRequest =newDimissionRequest();
Request addMoneyRequest =newAddMoneyRequest();
Request leaveRequest =newLeaveRequest();
System.out.println("==============");
//人事处理离职请求
pm.handleRequest(dimissionRequest);
System.out.println("===========");
//经理处理加薪请求
pm.handleRequest(addMoneyRequest);
System.out.println("========");
//项目组长处理请假请求
pm.handleRequest(leaveRequest);
}
}
在使用时要调用最高级的职责调用者,由他去负责往下分配职责