策略模式是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可相互替换。这使得算法的变化独立于使用算法的客户端。简而言之,策略模式允许在运行时选择算法,而不是在编译时固定使用某种算法。
策略模式主要包含以下角色:
- 策略接口(Strategy Interface):它定义了所有支持的算法的通用接口,通过这个接口,所有的具体策略类都可以被调用。
- 具体策略类(Concrete Strategies):它实现了策略接口,提供了具体的算法实现。
- 环境类(Context):它持有一个策略接口的引用,用于执行具体的策略。
常见策略模式写法:
现在的业务需求:
* 案例实现
* 【例】一家百货公司,针对不同的节日推出不同的促销活动,由促销员将促销活动展示给客户。
* 这里每种不同的促销活动就像当于一个个算法,可以使用于各个的活动
常见的策略模式,每有一种策略,就会有一个实现类。这样的话可能就会导致实现类过多的情况。这里不详细说常见策略模式的写法了。直接因此枚举类+map实现策略模式。
优雅的实现策略模式,可以通过map+枚举类实现。
//使用枚举类来实现策略模式的好处就是,如果策略过多,抽象的Strategy的实现类就会过多。而枚举类不用担心这点
public enum Strategy {
A{
@Override
void exec() {
System.out.println("春节优惠策略被执行");
}
},
B{
@Override
void exec() {
System.out.println("国庆优惠策略被执行");
}
},
C{
@Override
void exec() {
System.out.println("元旦优惠策略被执行");
}
}
;
abstract void exec();
}
public static void main(String[] args) {
HashMap<String, Strategy> strategyHashMap = new HashMap<>();
strategyHashMap.put("春节",Strategy.A);
strategyHashMap.put("国庆",Strategy.B);
strategyHashMap.put("元旦",Strategy.C);
//这个str可以由前端传入,让用户选择执行哪种策略
String str = "春节";
strategyHashMap.get(str).exec();
}