Strategy Pattern 策略模式是一种比较简单的模式,其定义如下:
Define a family of algorithms, encapsulate each one, and make them interchangeable
定义一组算法,将每个算法封装起来,并且使它们可以互换
通用源码:
public interface Strategy { // 策略模式的运算法则 public void doSomething(); }
public class ConcreteStrategy1 implements Strategy { @Override public void doSomething() { System.out.println("具体策略1的运算法则"); } }
public class ConcreteStrategy2 implements Strategy { @Override public void doSomething() { System.out.println("具体策略2的运算法则"); } }
public class Context { // 抽象策略 private Strategy strategy = null; //构造函数设置具体的策略 public Context(Strategy _strategy) { this.strategy = _strategy; } // 封装后的策略方法 public void doAnything() { this.strategy.doSomething(); } }
最后是演示类:
public class Client { public static void main(String[] args) { // 声明一个具体策略 Strategy strategy = new ConcreteStrategy1(); // 声明上下文 Context context = new Context(strategy); // 执行封装后的方法 context.doAnything(); } }
策略模式的优点:
1,算法可以自由切换
2,避免使用多重条件判断
3,扩展性良好
策略模式的缺点:
1,策略类数量增多
2,所有策略类都需要对外暴露,我们可以使用其他模式来修正这个缺陷,比如工厂方法、代理模式等
策略模式使用场景:
1,多个类只有在算法或行为上稍有不同的场景
2,算法需要自由切换的场景
3,需要屏蔽算法规则的场景
策略模式注意事项:
如果系统中一个策略家族具体数量超过4个,则需要考虑使用混合模式。
策略模式的扩展:策略枚举
一个简单的输入两个数和一个+或者-的运算符号,计算结果。
public enum Calculator { // 加法运算 ADD("+") { @Override public int exec(int a, int b) { return a + b; } }, //减法运算 SUB("-") { @Override public int exec(int a, int b) { return a - b; } }; String value = ""; private Calculator(String _value) { this.value = _value; } public String getValue() { return this.value; } public abstract int exec(int a, int b); }
public class ClientEnum { public static void main(String[] args) { // 输入两个参数是数字 int a = Integer.parseInt(args[0]); String symbol = args[1]; int b = Integer.parseInt(args[2]); System.out.println("输入参数为:" + Arrays.toString(args)); System.out.println("运行结果为:" + Calculator.valueOf(symbol).exec(a, b)); } }
实际项目中,我们一般通过工厂方法来实现策略类的声明。
本人博客已搬家,新地址为:http://yidao620c.github.io/