
多喝灬丶烫水
V1
2022/12/21阅读:31主题:默认主题
设计模式-策略模式
概念
-
策略模式是一种行为设计模式 -
image-20220927105224342 -
就是将一个东西(入参) -
传到分发中心(上下文或环境类) -
分发中心根据条件的不同选择不同的处理方式(策略) -
每一个方式(具体的实现类)对应相应的处理方法(类中的方法)(可以抽出公共的接口或抽象类) -
东西通过相应的处理方法 -
输出最终的产品(出参)。
-
使用方式
-
定义一个公共接口或者抽象类 -
每个方式(策略)去实现该接口或者抽象类 -
定义一个环境类去调用不同的策略
业务场景
-
促销活动
一家百货公司在定年度的促销活动。针对不同的节日(春节、中秋节、圣诞节)推出不同的促销活动,由促销员将促销活动展示给客户。
代码实现
-
定义一个公共接口或者抽象类
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");
} -
结果
现在正值春节佳节
春节活动:买一送一
作者介绍

多喝灬丶烫水
V1