一、责任链模式
1、责任链模式
责任链模式(Chain of Responsibility Pattern)是一种行为型模式。该模式会为请求创建一个接收者对象的链。在这个责任链里,通常每个接收者都包含对另一个接收者的引用,如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推而形成的链式响应。
2、优点
(1)、降低耦合度:请求发送方无需关注处理请求体,直接使用链处理。
(2)、代码更灵活,可扩展能力比较强。
3、实现思路
(1)、定义规范接口(包含目标方法,和设置下一个接收对象的方法)
(2)、编写各种实现类,实现目标方法(逻辑:本级能处理就处理,处理不了转发给下一级处理)
(3)、创建链路类,也要实现规范接口,同时构造生成链路的方法
(4)、使用链路调用方法
二、代码示例
1、代码场景
卖商品的场景:销售员最多卖5个,商店最多可卖100个,区域总部最多可卖10000个,中国总部不限制数量。要求不管用户买多少个都能实现。
// 1、定义规范
public abstract class Sailer {
public Sailer nestSailer; // 定义下一接收对象属性
public void setNest(Sailer nestSailer) { // 设置下一个接收对象
this.nestSailer = nestSailer;
}
abstract void sail(int num); // 目标方法
}
// 2.1、销售员实现类
public class PersonSailer extends Sailer {
public static int MAX_NUM = 5;
@Override
public void sail(int num) {
if (num < MAX_NUM) {
System.out.println("销售员最大可卖数量为" + MAX_NUM + ",本次卖出数量为:" + num);
} else {
this.nestSailer.sail(num);
}
}
}
// 2.2、商店实现类
public class ShopSailer extends Sailer {
public static int MAX_NUM = 100;
@Override
public void sail(int num) {
if (num < MAX_NUM) {
System.out.println("商店最大可卖数量为" + MAX_NUM + ",本次卖出数量为:" + num);
} else {
this.nestSailer.sail(num);
}
}
}
// 2.3、区域总部实现类
public class AreaSailer extends Sailer {
public static int MAX_NUM = 10000;
@Override
public void sail(int num) {
if (num < MAX_NUM) {
System.out.println("地区总部最大可卖数量为" + MAX_NUM + ",本次卖出数量为:" + num);
} else {
this.nestSailer.sail(num);
}
}
}
// 2.4、中国总部实现类
public class ChinaSailer extends Sailer {
@Override
public void sail(int num) {
System.out.println("中国总部售卖不限量,本次卖出数量为:" + num);
}
}
// 3、生成销售链
public class SailerChain extends Sailer{
private static Sailer sailerChain; // 销售链
static { // 初始化生成销售链
Sailer chinaSailer = new ChinaSailer();
Sailer areaSailer = new AreaSailer();
Sailer shopSailer = new ShopSailer();
Sailer personSailer = new PersonSailer();
personSailer.setNest(shopSailer);
shopSailer.setNest(areaSailer);
areaSailer.setNest(chinaSailer);
sailerChain = personSailer;
}
@Override
void sail(int num) {
sailerChain.sail(num);
}
}
// 4、测试,使用销售炼卖,而不是具体的实体对象卖
public static void main(String[] args) {
SailerChain chain = new SailerChain();
chain.sail(3);
chain.sail(30);
chain.sail(3000);
chain.sail(300000);
}
运行结果:
可以看到,通过销售链可以根据卖出数量调用不同的方法。
2、总结
当多个实现类都可以处理某种类型请求时,可以根据请求的条件来决定最终由哪一个类去处理这个请求,如本例的责任链模式就是一种实现方式。责任链模式的链路生成思路是通过内置了下一个对象的引用来实现的。当条件满足时直接处理业务,不满足就放给下一个接收者去处理,或者某些场景下也可以是处理完业务也放给下一个链路去处理(如:错误日志和全量日志),具体需要根据业务去改造即可。
学海无涯苦作舟!!!