共计 2561 个字符,预计需要花费 7 分钟才能阅读完成。
概念
- 策略模式是一种行为设计模式
-
- 就是将一个货色(入参)
- 传到散发核心(上下文或环境类)
- 散发核心依据条件的不同抉择不同的解决形式(策略)
- 每一个形式(具体的实现类)对应相应的解决办法(类中的办法)(能够抽出公共的接口或抽象类)
- 货色通过相应的解决办法
- 输入最终的产品(出参)。
应用形式
- 定义一个公共接口或者抽象类
- 每个形式(策略)去实现该接口或者抽象类
- 定义一个环境类去调用不同的策略
业务场景
-
促销流动
一家百货公司在定年度的促销流动。针对不同的节日(春节、中秋节、圣诞节)推出不同的促销流动,由促销员将促销流动展现给客户。
代码实现
-
定义一个公共接口或者抽象类
public interface FestivalStrategy {FestivalEnum getFestivalEnum(); void show();}
-
每个形式(策略)去实现该接口或者抽象类
@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("圣诞流动"); } }
-
定义一个环境类去调用不同的策略
@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();} } }
-
调用
@Autowired FestivalStrategyUseService festivalStrategyUseService; @Test public void test3(){ // 第一种 festivalStrategyUseService.showFestivalAndContext(FestivalEnum.CHINESE_NEW_YEAR); // 第二种 festivalStrategyUseService.showFestivalAndContext("NewYearStrategy"); }
-
后果
当初正值春节佳节 春节流动:买一送一
本文由 mdnice 多平台公布
正文完