`
yangshen998
  • 浏览: 1246913 次
文章分类
社区版块
存档分类
最新评论

java 设计模式 学习笔记(4) 策略模式

 
阅读更多

策略模式是一种定义一系列算法的方法,从概念上来看,所有的这些方法完成的都是相同的工作,只是实现不同。

它可以以相同的方式调用所有算法,减少了各种算法类和使用算法的类之间的耦合。

为什么要使用策略模式中的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) 并观察结果来判断该类的实现是否正确。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics