Define a family of algorithms, encapsulate each one, and make them interchangeable。(定义一组算法,或将每个算法都封装起来,并且使他们之间可以互换。)
策略模式介绍
类图:
策略模式是基于面向对象的继承和多态机制实现
策略模式分析
优势:
- 算法可以自由切换
- 避免使用多重判断语句,消除一些条件语句
- 扩展性良好
- 可以根据不同的时间/空间的要求选择不同的策略
缺点:
- 客户如果想选择一个合适的策略,那么就务必了解所有的策略以及各个策略之间有什么不同,这个时候就不得不暴漏策略具体的实现。该缺点可以配合工厂方法模式来弥补
- Strategy与Context之间的通信开销,由于策略算法不一定全部用得到,所以会带来一定的浪费
- 增加了对象的数目
策略模式之实现
Golang
Java
以下代码就根据理发店充值活动来实现的。首先是抽象的策略接口:
public interface Strategy{
//每个充值的方法都是一个算法
public void reCharge();
}
然后是冲500送300的策略:
public class St1 implements Strategy{
public viod reCharge(){
System.out.println("冲500送300");
}
}
接着是冲1000送500的策略的具体实现:
public class St2 implements Strategy{
public viod reCharge(){
System.out.println("冲1000送500");
}
}
接下来这个还需要一个封装类用于放这些个策略,方便使用,也就是类图中的Context封装类,代码如下:
public class Context{
//构造函数,你要入手哪一个优惠政策
private Strategy strategy;
public Context (Strategy strategy)
{
this.strategy = strategy;
}
//入手优惠政策
public void reCharge(){
this.strategy.reCharge();
}
}
通过构造函数把优惠政策传进去,然后用reCharge方法来执行相关的策略方法。什么,还不懂?好吧好吧,服了你啦,看洒家写一个测试类:
public class Y{
public static void main(String[] args) {
Context context;
//入手第一个优惠
context = new Context(new St1());
context.reCharge();
//入手第二个优惠
context = new Context(new St2());
context.reCharge();
}
}
好了,具体实现到此结束。下面介绍一下应用的场景。
策略模式之运用场景
当存在以下情况时,可以考虑使用策略模式:
- 许多相关的类仅仅是行为有异。
- 需要使用一个算法的不同变体。
- 一个类定义了多种行为。
- 需要屏蔽算法规则。