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);
    }

可以看到结果:

商品基础校验苹果
商品拥有者校验张三
商品明细信息校验陕西冰糖心

posted on 2024-10-26 17:42  自由港  阅读(41)  评论(0编辑  收藏  举报