设计模式学习——策略模式
一、介绍
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
策略模式应用的例子很多,比如最常见的Java类库中的 Comparator,它将对象的具体比较算法封装起来,我们可以根据所要比较的对象的类型自由选择。策略模式类图如下:
这个类图中右边是策略接口以及它的实现类,左边会有一个上下文,这个上下文会拥有一个策略,而具体这个策略是哪一种,我们是可以根据场景进行替换替换。
二、实现
接下来我们通过一段代码举例说明,下面的代码主要实现整数加减乘除计算的功能,我们将加、减、乘、除分别封装为四个策略,通过CalculateContext选择具体的策略进行计算。
首先是策略接口以及它的实现类。
public interface CalculateStrategy { int execute(int num1, int num2); } public class AddStrategy implements CalculateStrategy { @Override public int execute(int num1, int num2) { return num1 + num2; } } public class ReduceStrategy implements CalculateStrategy { @Override public int execute(int num1, int num2) { return num1 - num2; } } public class MultipiStrategy implements CalculateStrategy{ @Override public int execute(int num1, int num2) { return num1 * num2; } } public class DivisionStrategy implements CalculateStrategy{ @Override public int execute(int num1, int num2) { return num1 / num2; } }
接着是Context类
public class CalculateContext { private CalculateStrategy calculateStrategy; public CalculateContext() { } public void setCalculateStrategy(CalculateStrategy calculateStrategy) { this.calculateStrategy = calculateStrategy; } public int execute(int num1, int num2) { return calculateStrategy.execute(num1, num2); } }
最后我们使用client进行调用
public class Main { public static void main(String[] args) { CalculateContext calculateContext = new CalculateContext(); calculateContext.setCalculateStrategy(new AddStrategy()); calculateContext.execute(1, 2); calculateContext.setCalculateStrategy(new ReduceStrategy()); calculateContext.execute(2, 1); calculateContext.setCalculateStrategy(new MultipiStrategy()); calculateContext.execute(2, 2); calculateContext.setCalculateStrategy(new DivisionStrategy()); calculateContext.execute(4, 2); }