1. 类图
- Handler:定义职责的接口,通常定义处理请求的方法,可以在此处实现后继链
- ConcreteHandler:实现职责的类,对职责范围内请求的处理,对职责范围外请求的转发
- Client:客户端,向链上的具体处理对象提交请求,让职责链负责处理
2. 示例
分离职责,动态组合
2.1 职责接口
public abstract class Handler {
// 持有后继的职责对象
protected Handler handler;
public void setHandler(Handler handler) {
this.handler = handler;
}
public abstract String handlRequest(String user, double fee);
}
2.2 职责实现类
public class DepManager extends Handler {
@Override
public String handlRequest(String user, double fee) {
String handleResult = "";
if (fee < 1000) {
handleResult = "部门经理同意[" + user + "]的报销请求";
} else {
System.out.println("报销金额超过1000,部门经理无权审批");
if (this.handler != null) {
handleResult = this.handler.handlRequest(user, fee);
}
}
return handleResult;
}
}
public class ProjectManager extends Handler {
@Override
public String handlRequest(String user, double fee) {
String handleResult = "";
if (fee < 500) {
handleResult = "项目经理同意[" + user + "]的报销请求";
} else {
System.out.println("报销金额超过500,项目经理无权审批");
if (this.handler != null) {
handleResult = this.handler.handlRequest(user, fee);
}
}
return handleResult;
}
}
2.3 客户端
public class Client {
public static void main(String[] args) {
DepManager depManager = new DepManager();
ProjectManager projectManager = new ProjectManager();
projectManager.setHandler(depManager);
System.out.println(projectManager.handlRequest("张三", 400));
System.out.println(projectManager.handlRequest("李四", 800));
}
}
3. 优点
- 请求者和接收者松散耦合
- 动态组合职责
4. 缺点
- 产生很多细粒度对象
- 请求不一定会被处理,需要提供默认处理方法