1、责任链模式的学习
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许你将请求沿着处理链进行传递,直到有一个处理者能够处理该请求。责任链模式将请求的发送者和接收者解耦,使多个对象都有机会处理请求。
责任链模式的工作方式如下:
- 客户端创建一个处理链,并将请求发送给链的第一个处理者。
- 每个处理者在接收到请求后,首先判断自己是否能够处理该请求。如果能够处理,则进行处理并结束;如果不能处理,则将请求传递给下一个处理者。
- 这个过程会一直持续下去,直到有一个处理者处理请求或者请求到达链的末尾。
2、责任链模式的使用
假设你正在开发一个在线购物系统,需要实现库存检查的功能。系统中有三个库存检查器,分别是仓库库存检查器、店铺库存检查器和供应商库存检查器。当用户下单购买商品时,需要按照一定的顺序进行库存检查,确保商品库存充足。
库存检查抽象类
public abstract class InventoryCheck {
protected InventoryCheck next;
public InventoryCheck(InventoryCheck inventoryCheck) {
this.next = inventoryCheck;
}
/**
* 库存检查
*/
protected abstract void check();
}
店铺库存检查(具体的处理者)
public class ShopInventoryCheck extends InventoryCheck {
public ShopInventoryCheck(InventoryCheck inventoryCheck) {
super(inventoryCheck);
}
@Override
protected void check() {
System.out.println("开始店铺库存检查");
if (false) {
System.out.println("店铺库存满足");
return;
}
System.out.println("店铺库存不满足");
if (Objects.nonNull(next)) {
next.check();
}
}
}
供应商库存检查(具体的处理者)
public class SupplierInventoryCheck extends InventoryCheck {
public SupplierInventoryCheck(InventoryCheck inventoryCheck) {
super(inventoryCheck);
}
@Override
protected void check() {
System.out.println("开始供应商库存检查");
if (false) {
System.out.println("供应商库存满足");
return;
}
System.out.println("供应商库存不满足");
if (Objects.nonNull(next)) {
next.check();
}
}
}
仓库库存检查(具体的处理者)
public class WareHouseInventoryCheck extends InventoryCheck {
public WareHouseInventoryCheck(InventoryCheck inventoryCheck) {
super(inventoryCheck);
}
@Override
protected void check() {
System.out.println("开始进行仓库库存检查");
if (false) {
System.out.println("仓库库存满足");
return;
}
System.out.println("仓库库存不满足");
if (Objects.nonNull(next)) {
next.check();
}
}
}
责任链模式客户端
public class ChainClient {
public static void main(String[] args) {
InventoryCheck shopInventoryCheck = new ShopInventoryCheck(null);
InventoryCheck supplierInventoryCheck = new SupplierInventoryCheck(shopInventoryCheck);
InventoryCheck wareHouseInventoryCheck = new WareHouseInventoryCheck(supplierInventoryCheck);
wareHouseInventoryCheck.check();
}
}
开始进行仓库库存检查
仓库库存不满足
开始供应商库存检查
供应商库存不满足
开始店铺库存检查
店铺库存不满足
3、总结
责任链模式的优点包括:
- 将请求的发送者和接收者解耦,让请求的发送者不需要知道具体的接收者是谁。
- 可以动态地组织和扩展处理链。
- 提供了灵活性,可以根据需要调整处理流程。
责任链模式适用的场景包括:
- 有多个对象可以处理同一请求,但具体处理者在运行时才能确定。
- 请求发送者不需要知道哪个对象将处理请求以及请求的处理过程。