本文共 4402 字,大约阅读时间需要 14 分钟。
职责链模式(Chain of Responsibility),使多个对象都有机会处理请求,从而避免发送者与接收者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止 。
1、管理者
public abstract class Manager { protected String name; //管理者的上级 protected Manager superior; public Manager(String name) { this.name = name; } //设置上级 public void setSuperior(Manager superior) { this.superior = superior; } //申请请求 public abstract void requestApplication(RequestMes requestMes);}
2、具体管理者
//经理public class CommonManager extends Manager { public CommonManager(String name) { super(name); } @Override public void requestApplication(RequestMes requestMes) { if(requestMes.getRequestType().equals("请假") && requestMes.getRequestNum() < 2){ System.out.println(name+",您的"+requestMes.getRequestType()+"审批通过,请假天数为:"+requestMes.getRequestNum()+" 批准人:"+this.name); }else { if (null != superior){ superior.requestApplication(requestMes); } } }}//总监public class Majordomo extends Manager { public Majordomo(String name) { super(name); } @Override public void requestApplication(RequestMes requestMes) { if(requestMes.getRequestType().equals("请假") && requestMes.getRequestNum() < 5){ System.out.println(name+",您的"+requestMes.getRequestType()+"审批通过,请假天数为:"+requestMes.getRequestNum()+" 批准人:"+this.name); }else { if (null != superior){ superior.requestApplication(requestMes); } } }}//总经理public class GeneralManager extends Manager { public GeneralManager(String name) { super(name); } @Override public void requestApplication(RequestMes requestMes) { if(requestMes.getRequestType().equals("请假") && requestMes.getRequestNum() < 10){ System.out.println(name+",您的"+requestMes.getRequestType()+"审批通过,请假天数为:"+requestMes.getRequestNum()+" 批准人:"+this.name); }else if(requestMes.getRequestType().equals("加薪") && requestMes.getRequestNum() < 1000){ System.out.println(name+",您的"+requestMes.getRequestType()+"审批通过,加薪数量为:"+requestMes.getRequestNum()+" 批准人:"+this.name); } else { System.out.println("拒绝请求!拒绝人:总经理。"); } }}
3、请求
public class RequestMes { private String requestType; private String requestContent; private int requestNum; public String getRequestType() { return requestType; } public void setRequestType(String requestType) { this.requestType = requestType; } public String getRequestContent() { return requestContent; } public void setRequestContent(String requestContent) { this.requestContent = requestContent; } public int getRequestNum() { return requestNum; } public void setRequestNum(int requestNum) { this.requestNum = requestNum; }}
4、测试类
public class Test { public static void main(String[] args) { CommonManager m1 = new CommonManager("aa经理"); Majordomo m2 = new Majordomo("bb总监"); GeneralManager m3 = new GeneralManager("cc总经理"); m1.setSuperior(m2); m2.setSuperior(m3); RequestMes requestMes1 =new RequestMes(); requestMes1.setRequestType("请假"); requestMes1.setRequestContent("小新请假"); requestMes1.setRequestNum(1); m1.requestApplication(requestMes1); RequestMes requestMes2 =new RequestMes(); requestMes2.setRequestType("请假"); requestMes2.setRequestContent("小新请假"); requestMes2.setRequestNum(4); m1.requestApplication(requestMes2); RequestMes requestMes3 =new RequestMes(); requestMes3.setRequestType("请假"); requestMes3.setRequestContent("小新请假"); requestMes3.setRequestNum(8); m1.requestApplication(requestMes3); RequestMes requestMes4 =new RequestMes(); requestMes4.setRequestType("加薪"); requestMes4.setRequestContent("小新加薪"); requestMes4.setRequestNum(800); m1.requestApplication(requestMes4); RequestMes requestMes5 =new RequestMes(); requestMes5.setRequestType("加薪"); requestMes5.setRequestContent("小新加薪"); requestMes5.setRequestNum(1800); m1.requestApplication(requestMes5); }}输出:aa经理,您的请假审批通过,请假天数为:1 批准人:aa经理bb总监,您的请假审批通过,请假天数为:4 批准人:bb总监cc总经理,您的请假审批通过,请假天数为:8 批准人:cc总经理cc总经理,您的加薪审批通过,加薪数量为:800 批准人:cc总经理拒绝请求!拒绝人:总经理。
注:参考文献《大话设计模式》程杰著。