一、概述
職責鍊模式(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總經理
拒絕請求!拒絕人:總經理。
注:參考文獻《大話設計模式》程傑著。