本文已参与「新人创作礼」活动,一起开启掘金创作之路。
责任链模式中,请求的发送者与请求的处理者是解耦的,请求者不关心 是谁处理了请求,只用关心请求是否得到了处理。多个处理者形成一个链式,当处理者无法处理请求时将请求传递给后继进行处理。每个处理者只需要继承请求处理器并实现方法对请求做具体的处理即可。
在实际中的应用:java中的异常处理机制、Servlet的过滤器。
代码示例:
场景描述:客户在买车时提出了一个期望的折扣,但销售人员可以批准的折扣是有限的,超过一定折扣就需要将该折扣请求传递给经理来审批,超过了经理的审批权限,经理再把请求传递给CEO。
1.请求处理器:
package com.wyh.pattern;
//价格处理器:每个PriceHandler都有一个后继,除了最高级别无后继。
public abstract class PriceHandler {
protected PriceHandler proccessor;
public void setProccessor(PriceHandler proccessor) {
this.proccessor = proccessor;
}
//抽象方法,不同的审批人做具体的实现
public abstract void proccessDiscount(float discount);
}
2.请求处理者:
package com.wyh.pattern;
public class Sales extends PriceHandler{
//销售人员的审批处理
@Override
public void proccessDiscount(float discount) {
//销售人员可以处理
if(discount < 0.05) {
//做具体的处理。。。此处以打印输出做演示
System.out.println("销售人员批准折扣:"+discount);
}else {
//当前级别无法处理请求,将请求传递给后继(this.proccessor是当前对象的后继,后继也是个审批人,就继续调用方法进行处理)
this.proccessor.proccessDiscount(discount);
}
}
}
package com.wyh.pattern;
public class Manager extends PriceHandler{
@Override
public void proccessDiscount(float discount) {
if(discount < 0.06) {
System.out.println("经理批准了申请:"+discount);
}else {
this.proccessor.proccessDiscount(discount);
}
}
}
package com.wyh.pattern;
public class Ceo extends PriceHandler{
//最高级别处理者,没有后继
@Override
public void proccessDiscount(float discount) {
if(discount < 0.07) {
System.out.println("CEO通过了审批");
}else {
System.out.println("拒绝申请");
}
}
}
3.请求处理者生产工厂:
package com.wyh.pattern;
/**
* <p>Title: HandlerFactory</p>
* <p>Description: 审批人工厂(产生的都是PriceHandler的处理器的实现类对象)</p>
* @author wyh
* @date Jul 6, 2019
*/
public class HandlerFactory {
public static PriceHandler createHandler() {
//假设有三个级别可以处理申请
Sales sales = new Sales();
Manager manager = new Manager();
Ceo ceo = new Ceo();
//设置每个级别的后继(体现责任链模式的链式特点)
sales.setProccessor(manager);
manager.setProccessor(ceo);
//初始返回最低级别的处理者,级别不够的时候向上级申请
return sales;
}
}
4.提出请求的消费者:
package com.wyh.pattern;
/**
* <p>Title: Customer</p>
* <p>Description: 客户实体
* 属性:想要申请的折扣
* 方法:向审批人提出申请(客户不关心该申请经过了哪些级别,也不关心最后由谁批准了)
* </p>
* @author wyh
* @date Jul 6, 2019
*/
public class Customer {
private float discount;
public void setDiscount(float discount) {
this.discount = discount;
}
//在传入审批人参数时,审批人直接由审批人工厂创建
public void request(PriceHandler proccessor) {
//有了审批人之后,调用方法处理具体的审批流程
proccessor.proccessDiscount(discount);
}
}
5.测试类:
package com.wyh.pattern;
public class MyTest {
public static void main(String[] args) {
//运行时,只需要创建客户对象,传入申请的折扣,并发出请求,后面的事情交给审批人处理
Customer customer = new Customer();
//customer.setDiscount(0.04f);
//customer.setDiscount(0.055f);
//customer.setDiscount(0.065f);
customer.setDiscount(0.075f);
customer.request(HandlerFactory.createHandler());
}
}
测试运行:
代码地址:GitHub - wyhuiii/ChainOfResponsibility: design pattern----COR