目录
一.什么是策略模式
策略模式(Strategy Pattern)又叫也叫政策模式(PolicyPattern),它是将定义的算法家族、分别封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户。
可以避免多重分支的if...else...和switch语句
属于行为型模式。
比如当我们支付的时候一般会有两种选择一种是微信一种是支付宝,这就是一种策略(就是说我们有不同的策略完成一个结果)
策略模式的优点:
- 策略模式符合开闭原则。
- 避免使用多重条件转移语句,如if...else...语句、switch语句
- 使用策略模式可以提高算法的保密性和安全性。
策略模式的缺点:
- 客户端必须知道所有的策略,并且自行决定使用哪一个策略类.
- 代码中会产生非常多策略类,增加维护难度。
策略模式的适用场景:
- 假如系统中有很多类,而他们的区别仅仅在于他们的行为不同。
- 一个系统需要动态地在几种算法中选择一种。
- 需要屏蔽算法规则。
二.代码演示
设想一个场景,马上双11我们的商品需要促销,我们有几个促销的策略,分别是优惠卷策略和拼团策略.
IPromitionStrategy:
public interface IPromitionStrategy {
void doPromite();
}
CouponStartegy:优惠卷
public class CouponStrategy implements IPromitionStrategy {
@Override
public void doPromite() {
System.out.println("优惠卷促销策略");
}
}
GroupStartegy:拼团
public class GroupStrategy implements IPromitionStrategy{
@Override
public void doPromite() {
System.out.println("团购优惠策略");
}
}
EmptyStartegy:
public class EmptyStrategy implements IPromitionStrategy{
@Override
public void doPromite() {
System.out.println("不使用优惠策略");
}
}
如果不使用策略模式的话,我们的代码会有很多的if,不够优雅
public class Test1 {
public static void main(String[] args) {
String strategy = "GROUP";
IPromitionStrategy promitionStrategy;
if (strategy.equals("GROUP")) {
promitionStrategy = new GroupStrategy();
} else if (strategy.equals("COUPON")) {
promitionStrategy = new CouponStrategy();
} else {
promitionStrategy = new EmptyStrategy();
}
promitionStrategy.doPromite();
}
}
我们可以使用策略模式 加入上下文: PayStrategy
public class PayStrategy {
public static final String COUPON = "COUPON"; //优惠卷
public static final String GROUP = "GROUP"; //拼团
public static final String EMPTY = "EMPTY"; //无优惠
private static Map<String, IPromitionStrategy> strategyMap = new ConcurrentHashMap<>();
static {
//初始化策略
strategyMap.put("COUPON", new CouponStrategy());
strategyMap.put("GROUP", new GroupStrategy());
}
public static IPromitionStrategy getPromitionStrategy(String strateg) {
if (strategyMap.containsKey(strateg)) {
return strategyMap.get(strateg);
} else {
//不适用优惠
return new EmptyStrategy();
}
}
}
public class Test1 {
IPromitionStrategy promitionStrategy =
PayStrategy.getPromitionStrategy(PayStrategy.COUPON);
promitionStrategy.doPromite();
}
}