1.为什么使用策略模式
我们在软件开发的时候会遇到这样一种情况,某一个功能可以通过多种算法或者策略来完成,通常要根据不同的环境来选择某一种算法或者策略。
在学习编程初期,我们可能会采用一种硬编码(Hard Coding)的方式来解决这个问题。如我们在一个类中定义一连串的方法,每个方法里实现一种算法;或者使用if-esle、switch-case来选择具体的算法。这两种方法都被称为硬编码,它们可维护性非常低,当有新的算法添加或者修改,我们要改变很多源代码以支持。
因此,我们定义一系列算法,把每一个算法封装起来,并且使他们可相互替换,从而使得算法可独立于使用它的客户而变化。这就是策略模式。
2.如何设计
首先,我们应了解策略模式的实现应有三种角色:
环境(Context):持有一个Strategy引用。
抽象策略(Strategy):通常为一个接口或者抽象类,在此描述具体策略类里需要的接口。
具体策略(Concrete Strategy):在此填充具体的算法或策略。
我们把一个类中可能变化的部分抽取出来,作为一个接口。然后在环境中包含这个接口的成员变量,通过其构造方法来获得继承这个接口的类的实例,并实例化这个成员变量。在主体中调用环境中的执行方法即可。
3.代码实现
首先定义抽象策略
/**
* 抽象接口,定义一个引擎启动方式
*
* @author Anthony
*
*/
public interface EngineStrategy {
public void engineStart();
}
然后定义具体策略
/**
* 电力汽车继承接口,展现电力发动汽车
*
* @author Anthony
*
*/
public class ElectricCar implements EngineStrategy {
@Override
public void engineStart() {
System.out.println("电力汽车,电能发动机");
}
}
/**
* 传统汽车继承接口,展现汽油发动汽车
*
* @author Anthony
*
*/
public class TraditionalCar implements EngineStrategy {
@Override
public void engineStart() {
System.out.println("传统汽车,汽油发动机");
}
}
之后定义环境类
/**
* 环境类里接收参数,判断你要展现那种汽车
*
* @author Anthony
*
*/
public class Context {
private EngineStrategy engineStrategy;
public Context(EngineStrategy engineStrategy) {
this.engineStrategy = engineStrategy;
}
public void execute() {
this.engineStrategy.engineStart();
}
}
主函数使用
public class StrategyMain {
public static void main(String[] args) {
Context context;
context = new Context(new ElectricCar());
context.execute();
}
}