设计模式-策略模式
概念
- 策略模式是一种行为设计模式
- 就是将一个东西(入参)
- 传到分发中心(上下文或环境类)
- 分发中心根据条件的不同选择不同的处理方式(策略)
- 每一个方式(具体的实现类)对应相应的处理方法(类中的方法)(可以抽出公共的接口或抽象类)
- 东西通过相应的处理方法
- 输出最终的产品(出参)。
使用方式
- 定义一个公共接口或者抽象类
- 每个方式(策略)去实现该接口或者抽象类
- 定义一个环境类去调用不同的策略
业务场景
-
促销活动
一家百货公司在定年度的促销活动。针对不同的节日(春节、中秋节、圣诞节)推出不同的促销活动,由促销员将促销活动展示给客户。
代码实现
-
定义一个公共接口或者抽象类
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"); }
-
结果
现在正值春节佳节 春节活动:买一送一
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下