设计模式17-责任链模式

119 阅读2分钟

1.场景问题解决

1.1 场景描述

购买请求决策项目介绍
决策因素:价格
决策级别:组长、部长、副总、总裁
考虑扩展性

1.2 OO设计

1.3 需求变动

1.4 带来问题

2.用设计模式改进

2.1 分析

2.2 重新设计

17责任链模式-1

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 分析思路

17责任链模式-2

3.3 责任链模式优缺点

  • 优点:
    • 将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求
    • 可以简化对象,因为它无须知道链的结构
    • 可以动态地增加或删减处理请求的链结构
  • 缺点:
    • 请求从链的开头进行遍历,对性能有一定的损耗
    • 并不保证请求一定被处理

4. 设计模式使用场景及注意

4.1 使用场景

  • 有多个对象可以处理一个请求
  • 不明确接收者的情况
  • 有序、无序链,线型、树形、环形链

4.2 责任链模式和状态模式主要区别

  • 责任链模式注重请求的传递
  • 状态模式注重对象状态的转换

5.参考文章

内容总计于HeadFirst设计模式及相关视频