【JAVA設計模式】職責鏈模式
阿新 • • 發佈:2018-12-31
一、定義
職責鏈模式使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個物件處理它為止。
如類圖所示,當客戶提交一個請求時,請求時沿鏈傳遞直至有一個ConcreteHandler物件負責處理它。接收者和傳送者都沒有對方的明確資訊,且鏈中的物件自己也並不知道鏈的結構,結果時職責鏈可簡化物件的相互連線,它們僅需保持一個指向其後繼者的引用,而不需要保持它所有的候選接受者的引用。這也是大大降低了耦合度。
二、UML類圖
三、實現
- 抽象職責類
package com.jthao. design.des.chain;
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 requestApplications(Request request);
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Manager getSuperior() {
return superior;
}
}
- 第一級處理類
package com.jthao.design.des.chain;
public class CommonManager extends Manager {
public CommonManager(String name) {
super (name);
}
@Override
public void requestApplications(Request request) {
if (request.getRequestType().equals("請假") && request.getRequestNum() <= 2) {
System.out.println("CommonManager 請假批准");
} else {
superior.requestApplications(request);
}
}
}
- 第二級處理類
package com.jthao.design.des.chain;
public class Majordomo extends Manager {
public Majordomo(String name) {
super(name);
}
@Override
public void requestApplications(Request request) {
if (request.getRequestType().equals("請假") && request.getRequestNum() <= 5) {
System.out.println("Majordomo 請假批准");
} else {
superior.requestApplications(request);
}
}
}
- 第三級處理類
package com.jthao.design.des.chain;
public class GeneralManager extends Manager {
public GeneralManager(String name) {
super(name);
}
@Override
public void requestApplications(Request request) {
if (request.getRequestType().equals("請假")) {
System.out.println("GeneralManager 請假批准");
} else if (request.getRequestType().equals("加薪") && request.getRequestNum() <= 500) {
System.out.println("GeneralManager 加薪批准");
} else if (request.getRequestType().equals("加薪") && request.getRequestNum() > 500) {
System.out.println("GeneralManager 在考慮考慮");
}
}
}
- 引用類
package com.jthao.design.des.chain;
public class Request {
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;
}
}
- 測試類
package com.jthao.design.des.chain;
public class Test {
public static void main(String[] args) {
CommonManager commonManager = new CommonManager("經理");
Majordomo majordomo = new Majordomo("總監");
GeneralManager generalManager = new GeneralManager("總經理");
commonManager.setSuperior(majordomo);
majordomo.setSuperior(generalManager);
Request request = new Request();
request.setRequestContent("小蘭請假");
request.setRequestNum(2);
request.setRequestType("請假");
commonManager.requestApplications(request);
request.setRequestNum(3);
commonManager.requestApplications(request);
request.setRequestNum(10);
commonManager.requestApplications(request);
request.setRequestContent("小蘭加薪");
request.setRequestNum(500);
request.setRequestType("加薪");
commonManager.requestApplications(request);
request.setRequestNum(2000);
commonManager.requestApplications(request);
}
}