一、定义
职责链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
如类图所示,当客户提交一个请求时,请求时沿链传递直至有一个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);
}
}