策略模式
策略模式从表理解,必定是有很多中策略,但是具体采用哪一种策略,那就是策略模式需要解决的问题。
策略模式定义了算法家族、分别封装起来,让他们之间可以相互替换,此模式让算法的变化不会影响到使用算法的用户。
例如模电商平台基本每个月都在做活动,如返现、打折等,这些算法的变化不需要进行停服维护,而是事先将算法都是想了,只是需要到特定的时间才会将这种算法启用。
定义算法的抽象:
public interface IPromote {
void doPromote();
}
事先将算法进行实现:
public class Cashback implements IPromote {
@Override
public void doPromote() {
System.out.println("返现活动开启");
}
}
public class Discount implements IPromote {
@Override
public void doPromote() {
System.out.println("限时打折活动");
}
}
将算法进行注册,便于以后执行算法启用:
public class PromoteOnlineController {
private final static Map<String,IPromote> register = new HashMap<>();
static{
register.put("discount",new Discount());
register.put("cashbacl",new Cashback());
}
public void setOnline(String promoteName){
register.get(promoteName).doPromote();
}
}
执行上线活动:
public static void main(String[] args) {
PromoteOnlineController controller = new PromoteOnlineController();
controller.setOnline("cashbacl");
controller.setOnline("discount");
}
返现活动开启
限时打折活动
执行上线活动的接口做在后台管理系统中,方便将活动进行控制。
策略模式能够最大程度的解决重复层叠的if....else
嵌套,使得代码更优雅,同时适用于需要再多种算法中选择一个或多个,而且算法将来还会进行复用的场景。
拓展
现在小程序或者web应用中,在支付的时候都可以选择支付方式,支持微信支付、支付宝支付、银联支付等,这中场景就很完美匹配了策略模式,不同的支付方式对应不同的支付算法,也会调用不同的支付接口,进行策略选择放在了也用选择上,这个案例进不贴了,给读者机会去实践。
总结
策略模式的优点:
策略模式符合开闭原则
避免使用多重条件语句,如if-else,switch-case,,使用策略模式可以提高算法的保密性和安全性。
策略模式的缺点:
客户端必须知道所有的策略,并且自行决定使用哪一个策略(但是系统可以提示和限制用户的选择)。
代码中会产生很多的策略类,增加维护难度