设计模式-责任链模式
使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
我们来举个例子
假如你住在XX省XX市XX县,当你在网上购物的时候,网站会从最近的仓库发货给你,根据不同的商品会有不同的选择,因为每个仓库中存储的货物并不相同。
先定义一个配货请求
@Data
@AllArgsConstructor
public class AllocatingRequest {
private String goods;
}
然后定义抽象的仓库
public abstract class Warehouse {
private String name;
protected Warehouse next;
public Warehouse(String name) {
this.name = name;
}
public String getName(){
return this.name;
}
public void setNext(Warehouse next){
this.next = next;
}
abstract Warehouse handlerRequest(AllocatingRequest request);
}
实现省市县三级仓库
public class CountyWarehouse extends Warehouse {
List<String> goods = Arrays.asList("水杯", "毛巾");
public CountyWarehouse(String name) {
super(name);
}
@Override
Warehouse handlerRequest(AllocatingRequest request) {
if (goods.contains(request.getGoods())) {
return this;
} else if (this.next != null){
return this.next.handlerRequest(request);
} else {
return null;
}
}
}
public class CityWarehouse extends Warehouse {
List<String> goods = Arrays.asList("水杯", "毛巾", "牙膏");
public CityWarehouse(String name) {
super(name);
}
@Override
Warehouse handlerRequest(AllocatingRequest request) {
if (goods.contains(request.getGoods())) {
return this;
} else if (this.next != null){
return this.next.handlerRequest(request);
} else {
return null;
}
}
}
public class ProvinceWarehouse extends Warehouse {
List<String> goods = Arrays.asList("水杯", "毛巾", "牙膏", "沐浴液");
public ProvinceWarehouse(String name) {
super(name);
}
@Override
Warehouse handlerRequest(AllocatingRequest request) {
if (goods.contains(request.getGoods())) {
return this;
} else if (this.next != null){
return this.next.handlerRequest(request);
} else {
return null;
}
}
}
现在我们先初始化仓库然后尝试调配货物
public class Demo {
public static void main(String[] args) {
Warehouse provinceWarehouse = new ProvinceWarehouse("XX省仓库");
Warehouse cityWarehouse = new CityWarehouse("XX省XX市仓库");
Warehouse countyWarehouse = new CountyWarehouse("XX省XX市XX县仓库");
countyWarehouse.setNext(cityWarehouse);
cityWarehouse.setNext(provinceWarehouse);
AllocatingRequest request1 = new AllocatingRequest("水杯");
System.out.println("水杯从" + countyWarehouse.handlerRequest(request1).getName() + "调货");
AllocatingRequest request2 = new AllocatingRequest("沐浴液");
System.out.println("沐浴液从" + countyWarehouse.handlerRequest(request2).getName() + "调货");
}
}
结果