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

    技术2022-05-20  49

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

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

     

    为什么要使用策略模式中的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 的和值

    public class AddStrategy implements Strategy { @Override public int calculate(int numA, int numB) { // TODO Auto-generated method stub return numA + numB; } }

     

    3. 再建立一个实现Strategy 接口的 multiStrategy类,实现calculate 方法,返回 numA和numB 的乘积。

    public class multiStrategy implements Strategy{ @Override public int calculate(int numA, int numB) { // TODO Auto-generated method stub return numA * numB; } }

    4. 建立一个 Context 类 ,该类用来保存 Strategy 实现类的引用,并在自己的方法中调用 实现类的calculate 方法,

    public class Context { Strategy strategy; public Context(Strategy strategy){ this.strategy = strategy; } public int getResult(int numA, int numB){ return strategy.calculate(numA, numB); } }

     

    5. 建立一个TestStrategy 类,来验证实验结果

     

    public class TestStrategy { public static void main(String[] args){ int numA = 4 ; int numB = 5; int result = 0; Context context; context = new Context(new AddStrategy()); result = context.getResult(numA, numB); System.out.println("AddStrategy result : "+ String.valueOf(result)); context = new Context(new multiStrategy()); result = context.getResult(numA, numB); System.out.println("multiStrategy result : "+ String.valueOf(result)); } } 

     

     

    输出结果为 :

    AddStrategy result : 9

    multiStrategy  result : 20

     

     

    从实验验证过程中可以看到传给了 Context 不同的Strategy 实现类,最后输出的结果就不同。但是我们知道,对numA 和numB 做的运算式发生在 Strategy 类中,因此,我们可以得出 由于Context 类得存在对 用户隐藏了运算细节,等于说Context 在 Strategy 实现类的外面又包了一层。

       “策略模式还有一个优点 是 简化了 但单元测试, 因为每个算法都有自己的类,可以通过自己的接口单独测试 ” 从AddStrategy 的代码中,我们确实可以看到,这个类包含了一个 calculate() 方法,因此,可以在单元测试里,直接

          new AddStrategy().calculate(3,4) 并观察结果来判断该类的实现是否正确。

     


    最新回复(0)