(一)模块概述
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间可以相互替换。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个。
(二)模块结构
策略模式包括3种角色:
1)抽象策略角色: 策略类,通常由一个接口或者抽象类实现。
2)具体策略角色:包装了相关的算法和行为。
3)环境角色:持有一个策略类的引用,最终给客户端调用,这个角色也有可能是客户端本身。
(三)Demo
下面以加减乘除运算为不同策略的例子进行说明:
抽象策略角色:
public interface ICalculator {
public int calculate(int a, int b);
}
加法具体策略角色:
public class StrategyPlus implements ICalculator {
@Override
public int calculate(int a, int b) {
return a + b;
}
}
减法具体策略角色:
public class StrategyMinus implements ICalculator {
@Override
public int calculate(int a, int b) {
return a - b;
}
}
乘
法具体策略角色:
public class StrategyMultiply implements ICalculator {
@Override
public int calculate(int a, int b) {
return a * b;
}
}
执行过程:
int a = 1;
int b = 1;
ICalculator ic = new StrategyPlus(); // 客户端选择需要的策略
int result = ic.calculate(a, b); // 统一的实现接口
System.out.println("运算的结果是:"+result);
执行结果:
运算的结果是:2