Java设计模式之策略模式

策略模式

简介:
      策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。这里所说的算法并不是指 “ 冒泡排序算法 ” 、“ 搜索算法 ” 之类的算法,它可以是一段代码、一个请求、一个业务操作。

下面举一个计算器的例子
类图:

这个模式涉及到三个角色:

  ● 环境(Context)角色:持有一个Strategy的引用。

  ● 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

  ● 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。

代码示例:
策略方法(抽象策略角色)

public interface Operation {
    int doOperation(int a,int b);
}

两个实现类(具体策略角色)

public class StrategySum implements Operation {
    @Override
    public int doOperation(int a, int b) {
        return a+b;
    }
}
public class StrategySub implements Operation {

    @Override
    public int doOperation(int a, int b) {
        return a-b;
    }
}

计算器类(环境角色)

public class Calculator {
    private Operation operation;

    public void setOperation(Operation operation) {
        this.operation = operation;
    }

    public int doOperation(int a, int b) {
        return this.operation.doOperation(a,b);
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        calculator.setOperation(new StrategySum());
        int result = calculator.doOperation(5,10);
        System.out.println("Sum结果为:"+result);

        calculator.setOperation(new StrategySub());
        int result1 = calculator.doOperation(10,5);
        System.out.println("Sub结果为:"+result1);
    }
}

测试结果:

Sum结果为:15
Sub结果为:5

看到这里可能有人会有疑问,为什么要把加、减、乘、除四则运算分别封装到类中?直接在 Calculator 中写 add() 、sub() 等方法不是更方便吗?甚至如果要添加其他的运算方法,每次都要创建一个类,反而更麻烦。

的确,用了策略模式之后代码比普通写法多了一些,但是这里假设一种场景:把写好的计算器代码打包好作为一个库发布出去给其他人用,其他人发现你的计算器中只有加、减、乘、除四个方法,而他想增加平方、开方等功能,怎么办?

如果是用普通写法写的计算器,想要增加功能唯一的办法就是修改你写好的 Calculator ,增加平方和开方两个 method 。

可是你提供的是一个 jar 包啊,jar 包,jar…jar…jar…jar…包……

就算你提供的是源码,你希望其他人可以随意修改你写好的代码吗?一般我们发布出去的开源框架或库都是经过千锤百炼、经过测试的代码,其他人随意修改我们的源码很容易产生不可预知的错误。

如果你用的是策略模式,那么其他人想要增加平方或开平方功能,只需要自己定义一个类实现你的 Operation 接口,然后调用 calculator.setOperation(new 平方类()); 即可。

看到这里相信你已经对策略模式有了一定的好感,甚至惊叹一声:哇,还有这种操作?

其实这里很好的体现了一个设计模式的基本原则:开闭原则。开闭原则说的是 ” 对修改关闭、对扩展开放 “ 。对修改关闭就是不希望别人修改我们的代码,此路不通,对扩展开放就是希望别人以扩展的方式增加功能,策略模式把开闭原则体现得淋漓尽致。
策略模式的缺点:

        (1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。

  (2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。

 

posted @ 2019-03-19 11:08  madecine  阅读(137)  评论(0编辑  收藏  举报