相关文档:Java面向对象设计模式
策略模式(strategy)
策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。
一种方法是 需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数,关系图如下:
图中ICalculator提供同意的方法,AbstractCalculator是辅助类,提供辅助方法,接下来,依次实现下每个类:
首先统一接口:
辅助类:
三个实现类:
简单的测试类:
输出:10
另一种方法是 定义一个抽象策略类,定义所有支持的算法的公共接口;具体策略类封装所有的算法或行为,继承于抽象类;添加一个辅助类来维护队抽象类的引用(可有可无)。 关系图如下:
抽象算法类,Strategy类,定义所有支持的算法的公共接口
public abstract class Strategy{
//算法方法
public abstract void AlgorithmInterface();
}
三个具体实现类
public class ConcreteStrategyA extends Strategy{
//算法A实现方法
@Override
public void AlgorithmInterface(){
//算法A的实现
}
}
public class ConcreteStrategyB extends Strategy{
//算法B实现方法
@Override
public void AlgorithmInterface(){
//算法B的实现
}
}
public class ConcreteStrategyC extends Strategy{
//算法C实现方法
@Override
public void AlgorithmInterface(){
//算法C的实现
}
}
public class Context{
Strategy strategy;
public Context(Strategy strategy){
this.strategy=strategy;
}
public void ContextInterface(){
strategy.AlgorithmInterface();
}
}
测试类
- public class StrategyTest {
- public static void main(String[] args) {
- Context context;
- context=new Context(new ConcreteStrategyA());
- context.ContextInterface();
- context=new Context(new ConcreteStrategyB());
- context.ContextInterface();
- .......
- }
总结:策略模式的决定权在用户,系统本身提供不同算法的实现,新增或者删除算法,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。