1.概述
在我们平时的工作中,填写分布填写数据,比如填入商品的基本信息,所有人信息,明细信息,这种情况就可以使用责任链模式来处理。
2.代码实现
2.1商品对象
public class ProductDto {
private String name;
private String owner;
private String detail;
}
2.2处理器基类
package com.study.chain;
public abstract class IHandler<T> {
private IHandler next;
public void setNext(IHandler next) {
this.next = next;
}
public boolean hasNext() {
return next != null;
}
public abstract Boolean handlerCurrent(T object);
//先处理当前,如果返回为true其还有下一个处理器,则调用下一个处理器。
public void handler(T object){
boolean rtn =handlerCurrent(object);
if(hasNext() && rtn){
next.handler(object);
}
}
}
2.3商品基础信息类
其中 Order 表示类的排序
@Order(1)
@Component
public class ProductBaseHandler extends IHandler<ProductDto> {
@Override
public Boolean handlerCurrent(ProductDto object) {
System.out.println("商品基础校验" + object.getName());
return true;
}
}
2.4商品所有人
@Order(2)
@Component
public class ProductOwnerHandler extends IHandler<ProductDto> {
@Override
public Boolean handlerCurrent(ProductDto object) {
System.err.println("商品拥有者校验" + object.getOwner());
return true;
}
}
2.5商品明细
@Component
@Order(3)
public class ProductDetailHandler extends IHandler<ProductDto> {
@Override
public Boolean handlerCurrent(ProductDto object) {
System.err.println("商品明细信息校验" + object.getDetail());
return true;
}
}
2.6处理器工厂类
public class CommonChainFactory<T> {
public IHandler<T> first;
public CommonChainFactory(List<IHandler<T>> list){
for(int i=0;i<list.size()-1;i++){
list.get(i).setNext(list.get(i+1));
}
first= list.get(0);
}
public void execute(T objectDto){
first.handler(objectDto);
}
}
由于这个是泛型类,需要通过配置类进行实例化。
2.7 配置工厂类
@Configuration
public class FactoryConfig {
@Bean
public CommonChainFactory<ProductDto> productChainFactory(List<IHandler<ProductDto>> list){
return new CommonChainFactory<>(list);
}
}
2.8 使用
@Resource
private CommonChainFactory<ProductDto> productChainFactory;
@GetMapping("/chain")
public void chain() {
ProductDto prod = new ProductDto("苹果","张三","陕西冰糖心");
productChainFactory.execute(prod);
}
可以看到结果:
商品基础校验苹果
商品拥有者校验张三
商品明细信息校验陕西冰糖心