工厂模式+策略模式实践
工厂模式+策略模式实践
- 业务需求:根据传入的订单信息,不同类型的产品分别走不同的处理方式。
- 业务流程
文章图片
- 技术设计:使用工厂模式+策略模式进行业务的处理
文章图片
- 代码实现
- 测试调用
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);
//···处理后
}
}
推荐阅读
- 硬笔楷书26
- --木木--|--木木-- 第二课作业#翼丰会(每日一淘6+1实战裂变被动引流# 6+1模式)
- 设计模式-代理模式-Proxy
- 【译】Rails|【译】Rails 5.0正式发布(Action Cable,API模式等)
- java静态代理模式
- VueX(Vuex|VueX(Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式)
- Kotlin基础(10)-代理模式在kotlin中的使用
- 长谈的确是这个时代需要的一种模式
- 《读_Head_First_有感》_“命令模式”
- 《教育心理学》读书笔记十四---学校班级管理的现状分析与策略研究