策略模式是一种定义一系列算法的方法,从概念上来看,所有的这些方法完成的都是相同的工作,只是实现不同。
它可以以相同的方式调用所有算法,减少了各种算法类和使用算法的类之间的耦合。
为什么要使用策略模式中的Context 类?
对于前面的三种工厂设计模式,如果用工厂来创建实例,并通过实例调用给实例类中的方法来实现功能。而使用了Context类,通过将 具体的算法类 注入到Context 构造函数中,并在Context 自身的函数中来调用 注入到构造函数中的 具体算法类的特定方法。也就是说,用户代码只是选择了一个具体的算法类并注入到 Context 对象中,然后通过操作 Context 类,来实现需要的功能,避免了用户代码直接操作 具体的算法类。
1. 定义一个 Strategy 接口,该接口为Context 定义了一个 calculate() 方法,并交给其实现类来具体实现。
public interface Strategy { public int calculate(int numA, int numB); }
2. 建立一个实现Strategy 接口的 AddStrategy 类,实现calculate 方法,返回 numA和numB 的和值
3. 再建立一个实现Strategy 接口的 multiStrategy类,实现calculate 方法,返回 numA和numB 的乘积。
4. 建立一个 Context 类 ,该类用来保存 Strategy 实现类的引用,并在自己的方法中调用 实现类的calculate 方法,
5. 建立一个TestStrategy 类,来验证实验结果
输出结果为 :
AddStrategy result : 9
multiStrategy result : 20
从实验验证过程中可以看到传给了 Context 不同的Strategy 实现类,最后输出的结果就不同。但是我们知道,对numA 和numB 做的运算式发生在 Strategy 类中,因此,我们可以得出 由于Context 类得存在对 用户隐藏了运算细节,等于说Context 在 Strategy 实现类的外面又包了一层。
“策略模式还有一个优点 是 简化了 但单元测试, 因为每个算法都有自己的类,可以通过自己的接口单独测试 ” 从AddStrategy 的代码中,我们确实可以看到,这个类包含了一个 calculate() 方法,因此,可以在单元测试里,直接
new AddStrategy().calculate(3,4) 并观察结果来判断该类的实现是否正确。