目录
上述代码 GitHub 地址:https://github.com/baicun/designPatterns
责任链模式:
多个对象都有机会处理请求,为了避免请求发送者与接收者耦合在一起,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式。
责任链模式优点:
将请求的发送者和处理者解耦,使多个对象都有机会处理这个请求;
客户端调用简单,无需关心发送请求给谁,链结构怎样,调用简化;
可以动态的增加或删减处理请求的链结构
责任链模式应用:
Servlet
过滤器
责任链模式实例:
类图:
示例:
财务审批流程:财务人员计划购买一批货品,需要申请经费,于是他在OA系统上发起一笔经费请求(Client.java),不同经费额度分别有组长、部门经理、总经理审批,于是有了责任链设计模式。
代码:
客户端发起请求
//客户端发起请求
public class Client {
public Client() { }
public PurchaseRequest sendRequst(int Type, int Number, float Price) {
return new PurchaseRequest(Type, Number, Price);
}
}
具体处理者-组长
public class GroupApprover extends Approver {
public GroupApprover(String Name) {
super(Name+" GroupLeader");
}
@Override
public void ProcessRequest(PurchaseRequest request) {
if (request.GetSum() < 5000) {
System.out.println("**This request " + request.GetID()
+ " will be handled by "
+ this.Name + " **");
} else {
successor.ProcessRequest(request);
}
}
}
具体处理者-部门经理
public class DepartmentApprover extends Approver {
public DepartmentApprover(String Name) {
super(Name + " DepartmentLeader");
}
@Override
public void ProcessRequest(PurchaseRequest request) {
if ((5000 <= request.GetSum()) && (request.GetSum() < 10000)) {
System.out.println("**This request " + request.GetID()
+ " will be handled by " + this.Name + " **");
} else {
successor.ProcessRequest(request);
}
}
}
具体处理者-总经理
public class PresidentApprover extends Approver {
public PresidentApprover(String Name) {
super(Name + " President");
}
@Override
public void ProcessRequest(PurchaseRequest request) {
if (10000 <= request.GetSum()) {
System.out.println("**This request " + request.GetID()
+ " will be handled by " + this.Name + " **");
}else {
successor.ProcessRequest(request);
}
}
}
测试类:
public class MainTest {
public static void main(String[] args) {
//初始化数据
Client mClient=new Client();
Approver GroupLeader=new GroupApprover("Tom");
Approver DepartmentLeader=new DepartmentApprover("Jerry");
Approver President=new PresidentApprover("Bush");
//设置责任链处理顺序
GroupLeader.SetSuccessor(DepartmentLeader);
DepartmentLeader.SetSuccessor(President);
President.SetSuccessor(GroupLeader);
//开始处理-设置处理起点:组长
GroupLeader.ProcessRequest(mClient.sendRequst(1, 100, 40));
GroupLeader.ProcessRequest(mClient.sendRequst(2, 200, 40));
GroupLeader.ProcessRequest(mClient.sendRequst(4, 400, 140));
//开始处理-设置处理起点:总经理
/*President.ProcessRequest(mClient.sendRequst(1, 100, 40));
President.ProcessRequest(mClient.sendRequst(2, 200, 40));
President.ProcessRequest(mClient.sendRequst(4, 400, 140));*/
}
}