1.场景问题解决
1.1 场景描述
购买请求决策项目介绍
决策因素:价格
决策级别:组长、部长、副总、总裁
考虑扩展性
1.2 OO设计
1.3 需求变动
1.4 带来问题
2.用设计模式改进
2.1 分析
2.2 重新设计
[外链图片转存失败(img-oMaIkeOH-1568476001888)(https://raw.githubusercontent.com/bobshute/public/master/imgs/csdn/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/17%E8%B4%A3%E4%BB%BB%E9%93%BE%E6%A8%A1%E5%BC%8F-1.png)]
2.3 源码
- PurchaseRequest(请求对象)和 Client(为员工请求[构造 PurchaseRequest])
public class PurchaseRequest {
private int Type = 0;
private int Number = 0;
private float Price = 0;
private int ID = 0;
public PurchaseRequest(int Type, int Number, float Price) {
this.Type = Type;
this.Number = Number;
this.Price = Price;
}
public int GetType() {
return Type;
}
public float GetSum() {
return Number * Price;
}
public int GetID() {
return (int) (Math.random() * 1000);
}
}
public class Client {
public Client() {
}
public PurchaseRequest sendRequst(int Type, int Number, float Price) {
return new PurchaseRequest(Type, Number, Price);
}
}
- Approver,GroupApprover,DepartmentApprover,VicePresidentApprover,PresidentApprover
public abstract class Approver {
Approver successor;
String name;
public Approver(String name){
this.name = name;
}
public abstract void processRequest(PurchaseRequest request);
//设置继承者 successor
public void setSuccessor(Approver successor) {
this.successor=successor;
}
}
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 VicePresidentApprover extends Approver {
public VicePresidentApprover(String Name) {
super(Name + " Vice President");
}
@Override
public void processRequest(PurchaseRequest request) {
if ((10000 <= request.GetSum()) && (request.GetSum() < 50000)) {
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 (50000 <= request.GetSum()) {
System.out.println("**This request " + request.GetID()
+ " will be handled by " + this.name + " **");
}else {
successor.processRequest(request);
}
}
}
- ChainmsTest测试类
public class ChainmsTest {
public static void main(String[] args) {
//员工请求
Client mClient=new Client();
Approver groupApprover=new GroupApprover("小组长");
Approver departmentApprover=new DepartmentApprover("部门经理");
Approver vicePresidentApprover=new VicePresidentApprover("副总裁");
Approver presidentApprover=new PresidentApprover("总裁");
groupApprover.setSuccessor(vicePresidentApprover);
departmentApprover.setSuccessor(presidentApprover);
vicePresidentApprover.setSuccessor(departmentApprover);
presidentApprover.setSuccessor(groupApprover);
vicePresidentApprover.processRequest(mClient.sendRequst(1, 100, 40));
vicePresidentApprover.processRequest(mClient.sendRequst(2, 200, 40));
vicePresidentApprover.processRequest(mClient.sendRequst(3, 300, 40));
vicePresidentApprover.processRequest(mClient.sendRequst(4, 400, 140));
}
}
3.设计模式总结
3.1 定义
责任链模式: 如果有多个对象都有机会处理请求,责任链可使请求的发送者和接收者解耦,请求沿着责任链传递,直到有一个对象处理了它为止。
3.2 分析思路
3.3 责任链模式优缺点
- 优点:
-
- 将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求
-
- 可以简化对象,因为它无须知道链的结构
-
- 可以动态地增加或删减处理请求的链结构
- 缺点:
-
- 请求从链的开头进行遍历,对性能有一定的损耗
-
- 并不保证请求一定被处理
4. 设计模式使用场景及注意
4.1 使用场景
- 有多个对象可以处理一个请求
- 不明确接收者的情况
- 有序、无序链,线型、树形、环形链
4.2 责任链模式和状态模式主要区别
- 责任链模式注重请求的传递
- 状态模式注重对象状态的转换
5.参考文章
内容总计于HeadFirst设计模式及相关视频