概念

  • 策略模式是一种行为设计模式
    • 就是将一个货色(入参)
    • 传到散发核心(上下文或环境类)
    • 散发核心依据条件的不同抉择不同的解决形式(策略)
    • 每一个形式(具体的实现类)对应相应的解决办法(类中的办法)(能够抽出公共的接口或抽象类)
    • 货色通过相应的解决办法
    • 输入最终的产品(出参)。

应用形式

  1. 定义一个公共接口或者抽象类
  2. 每个形式(策略)去实现该接口或者抽象类
  3. 定义一个环境类去调用不同的策略

业务场景

  • 促销流动

    一家百货公司在定年度的促销流动。针对不同的节日(春节、中秋节、圣诞节)推出不同的促销流动,由促销员将促销流动展现给客户。

代码实现

  1. 定义一个公共接口或者抽象类

    public interface FestivalStrategy {      FestivalEnum getFestivalEnum();      void show(); }
  2. 每个形式(策略)去实现该接口或者抽象类

     @Service public class NewYearStrategy implements FestivalStrategy{      @Override     public FestivalEnum getFestivalEnum() {         return FestivalEnum.CHINESE_NEW_YEAR;     }      @Override     public void show() {         System.out.println("春节流动");     } } 
     @Service public class MidAutumnStrategy implements FestivalStrategy {      @Override     public FestivalEnum getFestivalEnum() {         return FestivalEnum.MID_AUTUMN;     }      @Override     public void show() {         System.out.println("中秋流动");     } }
     @Service public class ChristmasStrategy implements FestivalStrategy {      @Override     public FestivalEnum getFestivalEnum() {         return FestivalEnum.CHRISTMAS;     }      @Override     public void show() {         System.out.println("圣诞流动");     } }
  3. 定义一个环境类去调用不同的策略

     @Component public class FestivalStrategyUseService implements ApplicationContextAware {     private Map<FestivalEnum,FestivalStrategy>  festivalStrategyMap =new HashMap<>();          @Override     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {         Map<String, FestivalStrategy> tmepMap = applicationContext.getBeansOfType(FestivalStrategy.class);         tmepMap.values().forEach(strategyService -> festivalStrategyMap.put(strategyService.getFestivalEnum(), strategyService));     }          public void showFestivalAndContext(FestivalEnum festivalEnum) {         FestivalStrategy festivalStrategy = festivalStrategyMap.get(festivalEnum);         if (festivalStrategy != null) {             System.out.println("当初正值"+festivalStrategy.getFestivalEnum().getName()+"佳节");             festivalStrategy.show();         }     } }

    或者

     @Component public class FestivalStrategyUseService {      @Autowired     private Map<String,FestivalStrategy>  festivalStrategyMap;              public void showFestivalAndContext(String festivalEnum) {         FestivalStrategy festivalStrategy = festivalStrategyMap.get(festivalEnum);         if (festivalStrategy != null) {             System.out.println("当初正值"+festivalStrategy.getFestivalEnum().getName()+"佳节");             festivalStrategy.show();         }     } }
  1. 调用

     @Autowired FestivalStrategyUseService festivalStrategyUseService;  @Test public void test3(){     //第一种     festivalStrategyUseService.showFestivalAndContext(FestivalEnum.CHINESE_NEW_YEAR);     //第二种     festivalStrategyUseService.showFestivalAndContext("NewYearStrategy"); }
  2. 后果

    当初正值春节佳节春节流动:买一送一

本文由mdnice多平台公布