上一篇文章介绍了策略模式+工厂模式的案例,但是上一篇是针对策略类比较少的情况下我们在策略工厂里面通过注入具体的策略实现类来完成,那如果策略实现类比较多呢?如果有几十个策略实现类难道要一个一个注入到工厂类里面吗?下面就讲解策略实现类比较多的时候如何处理。

案例:我们系统里面有很多销售和客户,我针对不同的场景需要圈出来该场景下的销售和客户进行其他操作(比如消息通知等),不同场景圈人群是不是就可以使用不同的策略来实现。

场景1:圈客户购物车有加购商品的客户

场景2:圈2024.08.01号有购买了商品的客户

场景3:圈出来所有销售给他们发短信和邮件提醒他们我们的大促活动

这种场景非常多,有可能多达几十上百种场景,那如果在工厂类一个个注入岂不是很麻烦?

下面直接代码说话

首先是策略接口:

public interface SceneTypeProcessStrategy{
   // 场景类型
   SceneType getSceneType();
   // 场景处理
   boolean process(Map<String,Object> params);
}

然后是接口实现:圈购物车有加购商品的客户策略实现

@Slf4j
@Service
public class CustAddShoppingCartStrategy implements SceneTypeProcessStrategy{
    @Autowired
    private MessagePushService MessagePushService;
    
    @Override
    public SceneType getSceneType(){
      return SceneType.CUST_HAS_ADD_SHOPPING_CART;
     }
 
    @Override
    public boolean process(Map<String,Object> params ){
       //1,查询出来有加购商品的客户信息
       //2、对这些客户进行其他业务操作
       MessagePushService.xxx()(
       return true;
    }
}

然后是:圈2024.08.01号有购买了商品的客户策略

@Slf4j
@Service
public class CustHasBuyingProductStrategy implements SceneTypeProcessStrategy{
    @Autowired
    private MessagePushService MessagePushService;
    
    @Override
    public SceneType getSceneType(){
      return SceneType.CUST_HAS_BUY_PRODUCT;
     }
 
    @Override
    public boolean process(Map<String,Object> params ){
       //1,查询出来08.01购买了商品的客户
       //2、对这些客户进行其他业务操作
       MessagePushService.xxx()(
       return true;
    }
}

最后是:圈出来所有销售给他们发短信和邮件提醒他们大促活动策略

@Slf4j
@Service
public class SalesPromotionNoticeStrategy implements SceneTypeProcessStrategy{
    @Autowired
    private MessagePushService MessagePushService;
    
    @Override
    public SceneType getSceneType(){
      return SceneType.SALES_PROMOTION_NOTICE;
     }
 
    @Override
    public boolean process(Map<String,Object> params ){
       //1,查询出所有销售
       //2、对这些客户进行其他业务操作
       MessagePushService.xxx()(
       return true;
    }
}

用到的枚举类:

@Getter
public enum SceneType{
   CUST_HAS_ADD_SHOPPING_CART("客户加入购物车","cust_has_add_shopping_cart),
   CUST_HAS_BUY_PRODUCT("8.01购买了商品","cust_has_buy_product),
   SALES_PROMOTION_NOTICE("所有销售通知大促","sales_promotion_notice);
   
   //当前触达场景
   private final String sceneCode;
   
   SceneType(String desc,String sceneCode){
      this.sceneCode=sceneCode;
   }
}

然后就是获取策略的工厂类:兄弟们看好了主要区别就是工厂类的写法

@Component
public class SceneTypeProcessStrategyFactory{
    private final Map<SceneType,SceneTypeProcessStrategy> strategyMap=new HashMap<>();
    /**
     * 创建工厂类的时候把策略接口传进去,会将所有的策略实现类都传进去
     * 也就是所有的实现类都会放到strategyMap里面,后面再从map里面获取某一个具体的实现类即可
     */
     public SceneTypeProcessStrategyFactory(List<SceneTypeProcessStrategy> sceneTypeProcessStrategyList){
        sceneTypeProcessStrategyList.forEach(strategy->strategyMap.put(strategy.getSceneType(),strategy));
      }

     public SceneTypeProcessStrategy getStrategy(SceneType sceneType){
         SceneTypeProcessStrategy sceneTypeProcessStrategy=strategyMap.get(sceneType);
         if(sceneTypeProcessStrategy==null){
            throw new RuntimeException("不支持的类型");
         }
         return sceneTypeProcessStrategy;
     }
 }

然后就是调用的时候:

@Slf4j
@Component
public class testStrategy{
   @Autowired
   private SceneTypeProcessStrategyFactory sceneTypeProcessStrategyFactory;
   
   @Override
   public Boolean execute(){
     //1、业务逻辑处理
     //2、获取具体的策略执行,返回执行结果
     SceneTypeProcessStrategy strategy=sceneTypeProcessStrategyFactory.getStrategy(SceneType.SALES_PROMOTION_NOTICE);
     return strategy.process(xxxx);
  }
}

到此策略模式+工厂模式之多策略实现类如何处理就结束了,欢迎点评和指出不足之处。