Java——Java基础之设计模式篇:责任链模式
1、需求
学校OA系统的采购审批项目:需求是 采购员采购教学器材 如果金额小于等于5000,由教学主任审批 如果金额小于等于10000,由院长审批 如果金额小于等于30000,由副校长审批 如果金额超过30000以上,有校长审批
2、方案一
最容易想到的,将需求转变成if else。导致代码强耦合,需要知道不同人审批的金额界限,并且如果审批金额界限发生变化,相关代码也要改变。
if (price <= 5000) { 教学主任审批 } else if (price <= 10000) { 院长审批 } else if (price <= 30000) { 副校长审批 } else { 校长审批 }
3、方案二:责任链
责任链模式:为请求创建了一个处理者对象的链。每个处理者都包含对另一个处理者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个处理者,依此类推。
-
客户端:创建处理链,从责任链的第一个处理者开始处理请求 抽象处理者:包含下一个处理者、处理请求的方法 具体处理者:实现抽象处理者的处理请求方法,判断能否处理本次请求,如果可以则处理请求,否则将该请求转给它的后继者
代码实现:重在思路
-
创建请求
@Data public class MyRequest { private int price; public MyRequest(int price) { this.price = price; } }
-
创建抽象处理者
public abstract class Handler { // 必须:下一个处理者 Handler nextHandler; public void setNext(Handler nextHandler) { this.nextHandler = nextHandler; } // 必须:处理请求的方法 public abstract void handleRequest(MyRequest request); // 可选 String handlerName; public Handler(String name) { this.handlerName = name; } }
-
创建具体处理者
public class 教学主任 extends Handler { // 必须:实现抽象处理者的处理请求方法 @Override public void handleRequest(MyRequest request) { if(request.getPrice() <= 5000) { System.out.println("被"+this.name+"处理"); } //如果不满足条件,则丢给下一个处理者 else { System.out.println("不能被"+this.name+"处理"); nextHandler.handleRequest(request); } } // 可选 public 教学主任(String name) { super(name); } } public class 院长 extends Handler { // 必须:实现抽象处理者的处理请求方法 @Override public void handleRequest(MyRequest request) { // 判断能否处理本次请求,如果可以则处理请求 if (request.getPrice() <= 5000) { System.out.println("被"+this.name+"处理"); } // 否则丢给下一个处理者 else { System.out.println("不能被"+this.name+"处理"); nextHandler.handleRequest(request); } } // 可选 public 院长(String name) { super(name); } } public class 副校长 extends Handler { } public class 校长 extends Handler { }
-
客户端
public class Client { public static void main(String[] args) { // 1、创建请求 MyRequest request = new MyRequest(28000); // 2、创建所有需要的处理者 教学主任 教学主任1 = new 教学主任("张教学主任"); 院长 院长2 = new 院长("王院长"); 副校长 副校长3 = new 副校长("孙副校长"); 校长 校长4 = new 校长("李校长"); // 3、形成责任链 教学主任1.setNext(院长2); 院长2.setNext(副校长3); 副校长3.setNext(校长4); // 4、从责任链的第一个处理者开始处理请求 教学主任1.handleRequest(request); } }
下一篇:
分隔链表(精美图示详解哦)