一、概述
职责链模式(Chain of Responsibility),使多个对象都有机会处理请求,从而避免发送者与接收者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止 。
二、UML图示
三、代码实现
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总经理
拒绝请求!拒绝人:总经理。
注:参考文献《大话设计模式》程杰著。