工厂模式+策略模式实践

工厂模式+策略模式实践

  1. 业务需求:根据传入的订单信息,不同类型的产品分别走不同的处理方式。
  2. 业务流程工厂模式+策略模式实践_第1张图片
  3. 技术设计:使用工厂模式+策略模式进行业务的处理工厂模式+策略模式实践_第2张图片
  4. 代码实现
  5. 测试调用
public class TestService{

    public static void main(String[] args) {
                //···处理前
                //构造订单信息
                ProductOrderInfo productOrderInfo = new ProductOrderInfo();
                //根据产品类型在产品策略工厂获取策略
        ProductStrategy productStrategy = ProductStrategyFactory.getProductStrategy(productOrderInfo.getProductType);
                //通过产品策略构造产品处理器对象
                ProductHandler productHandler = new ProductHandler(productStrategy);
                //执行处理操作
        productHandler.handler(productOrderInfo);
                //···处理后
    }
}
  • 产品订单信息
public class ProductOrderInfo {

        //产品类型
    private ProductType productType;
        ······
}
  • 产品策略工厂
@Component
public class ProductStrategyFactory implements InitializingBean {
    @Autowired
    private List productStrategies;

    private static Map productStrategyMap;

    @Override
        //初始化bean的时候执行,将策略存入map当中
    public void afterPropertiesSet() throws Exception {
        productStrategyMap = productStrategies.stream().collect(Collectors
                                                        .toMap(ProductStrategy::getProductType, Function.identity()));
    }

        //根据产品类型获取对应的策略
    public static ProductStrategy getProductStrategy(ProductType productType) {
        if (productType == null ) {
            throw new Exception("productType不能为空!");
        }
        return productStrategyMap.get(productType);
    }
}
  • 初始化Bean
public interface InitializingBean {

    //初始化bean的时候执行
    void afterPropertiesSet() throws Exception;

}
  • 产品策略接口
public interface ProductStrategy {

    /**
     * 获取产品类型
     * @return 产品类型
     */
    ProductType getProductType();

    /**
     * 处理订单信息
     * @param productOrderInfo 订单信息
     * @return 处理结果
     */
    boolean processProduct(ProductOrderInfo productOrderInfo);
  • Alpha产品策略
@Component
public class AlphaProductStrategy implements ProductStrategy {

    @Override
    public ProductType getProductType() {
        return ProductType.ALPHA;
    }

    @Override
    public boolean processProduct(ProductOrderInfo productOrderInfo) {
       //具体处理逻辑···
    }
}
  • Beta产品策略
@Component
public class BetaProductStrategy implements ProductStrategy {

    @Override
    public ProductType getProductType() {
        return ProductType.BETA;
    }

    @Override
    public boolean processProduct(ProductOrderInfo productOrderInfo) {
       //具体处理逻辑···
    }
}
  • Gamma产品策略
@Component
public class GammaProductStrategy implements ProductStrategy {

    @Override
    public ProductType getProductType() {
        return ProductType.GAMMA;
    }

    @Override
    public boolean processProduct(ProductOrderInfo productOrderInfo) {
       //具体处理逻辑···
    }
}
  • 产品类型
@Getter
public enum ProductType {
        /**
     * 产品类型1
     */
    ALPHA(0, "α"),
    /**
     * 产品类型2
     */
    BETA(1, "β"),
    /**
     * 产品类型3
     */
    GAMMA(2, "γ");

        private Integer code;
        private String desc;
  • 产品订单处理器
public class ProductHandler{

    //产品策略
    private ProductStrategy productStrategy;

    public ProductHandler(ProductStrategy productStrategy){
        this.productStrategy = productStrategy;
    }

  //处理方法
    public Boolean handler(ProductOrderInfo productOrderInfo) {
                //···处理前
        boolean result = productStrategy.processProduct(productOrderInfo);
                //···处理后
    }
}

你可能感兴趣的:(java后端设计模式)