责任链模式
定义:如果有多个对象有机会处理请求,责任链可使请求的发送者和接受者解耦,请求沿着责任链传递,直到有一个对象处理了它为止。
主要解决:职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。
举例(购买请求决策,价格不同要由不同的级别决定:组长、部长、副部、总裁)。
决策者抽象类,包含对请求处理的函数,同时还包含指定下一个决策者的函数
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; } }
客户端以及请求
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); } }
组长、部长。。。继承决策者抽象类
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); } } } 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); } } }
测试
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); GroupLeader.ProcessRequest(mClient.sendRequst(1, 10000, 40)); } }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步