设计模式--责任链模式

               设计模式--责任链模式

 

责任链模式原理

购买请求决策项目

购买请求决策项目介绍

决策因素:价格

决策级别:组长、部长、副总、总裁

考虑扩展性

思考如何设计
设计模式--责任链模式

 

责任链模式原理
设计模式--责任链模式
设计模式--责任链模式
责任链模式:如果有多个对象都有机会处理请求,责任链可使请求的发送者和接收者解耦,请求沿着责任链传递,直到有一个对象处理了它为止。
 

责任链模式优缺点

优点:

 将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求

 可以简化对象,因为它无须知道链的结构

 可以动态地增加或删减处理请求的链结构

缺点:

 请求从链的开头进行遍历,对性能有一定的损耗

 并不保证请求一定被处理

责任链模式示例代码讲解

示例项目类结构
设计模式--责任链模式

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);
	}
}


Approver 

public abstract class Approver {
	 Approver successor;
	 String Name;
	public Approver(String Name)
	{
		this.Name=Name;
	}
	public abstract void ProcessRequest( PurchaseRequest request);
	public void SetSuccessor(Approver successor) {
		// TODO Auto-generated method stub
		this.successor=successor;
	}
}


GroupApprover 

public class GroupApprover extends Approver {

	public GroupApprover(String Name) {
		super(Name+" GroupLeader");
		// TODO Auto-generated constructor stub
		
	}

	@Override
	public void ProcessRequest(PurchaseRequest request) {
		// TODO Auto-generated method stub

		if (request.GetSum() < 5000) {
			System.out.println("**This request " + request.GetID()
					+ " will be handled by "
					+ this.Name + " **");
		} else {
			successor.ProcessRequest(request);
		}
	}

}


DepartmentApprover 

public class DepartmentApprover extends Approver {

	public DepartmentApprover(String Name) {
		super(Name + " DepartmentLeader");

	}

	@Override
	public void ProcessRequest(PurchaseRequest request) {
		// TODO Auto-generated method stub

		if ((5000 <= request.GetSum()) && (request.GetSum() < 10000)) {
			System.out.println("**This request " + request.GetID()
					+ " will be handled by " + this.Name + " **");
		} else {
			successor.ProcessRequest(request);
		}

	}

}


VicePresidentApprover 

public class VicePresidentApprover extends Approver {

	public VicePresidentApprover(String Name) {
		super(Name + " Vice President");
	}

	@Override
	public void ProcessRequest(PurchaseRequest request) {
		// TODO Auto-generated method stub
		if ((10000 <= request.GetSum()) && (request.GetSum() < 50000)) {
			System.out.println("**This request " + request.GetID()
					+ " will be handled by " + this.Name + " **");
		} else {
			successor.ProcessRequest(request);
		}
	}

}


PresidentApprover 

public class PresidentApprover extends Approver {

	public PresidentApprover(String Name) {
		super(Name + " President");

	}

	@Override
	public void ProcessRequest(PurchaseRequest request) {
		// TODO Auto-generated method stub
		if (50000 <= request.GetSum()) {
			System.out.println("**This request " + request.GetID()
					+ " will be handled by " + this.Name + " **");
		}else {
			successor.ProcessRequest(request);
		}
	}

}


Client 

public class Client {

	public Client() {

	}

	public PurchaseRequest sendRequst(int Type, int Number, float Price) {
		return new PurchaseRequest(Type, Number, Price);
	}

}


MainTest 

public class MainTest {

	public static void main(String[] args) {
		
		Client mClient=new Client();
		Approver GroupLeader=new GroupApprover("Tom");
		Approver DepartmentLeader=new DepartmentApprover("Jerry");
		Approver VicePresident=new VicePresidentApprover("Kate");
		Approver President=new PresidentApprover("Bush");
		
		GroupLeader.SetSuccessor(VicePresident);
		DepartmentLeader.SetSuccessor(President);
		VicePresident.SetSuccessor(DepartmentLeader);
		President.SetSuccessor(GroupLeader);
		
		VicePresident.ProcessRequest(mClient.sendRequst(1, 100, 40));
		VicePresident.ProcessRequest(mClient.sendRequst(2, 200, 40));
		VicePresident.ProcessRequest(mClient.sendRequst(3, 300, 40));
		VicePresident.ProcessRequest(mClient.sendRequst(4, 400, 140));
		
	}


}



责任链模式关键点

 

责任链模式原理
 

责任链模式:如果有多个对象都有机会处理请求,责任链可使请求的发送者和接收者解耦,请求沿着责任链传递,直到有一个对象处理了它为止。

适用场合:

有多个对象可以处理一个请求

不明确接收者的情况

有序、无序链,线型、树形、环形链

责任链模式与状态模式的差异

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

责任链模式注重请求的传递

状态模式注重对象状态的转换