一、策略模式的定义
策略模式是一种比较简单的模式,也叫做政策模式,他的定义是:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。
策略模式使用的就是面向对象的继承和多态机制,非常容易理解和掌握,我们再来看看策略模式的三个角色:
(1)Context封装角色
它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
(2)Strategy抽象策略角色
策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性,
(3)ConcreteStrategy具体策略角色
实现抽象策略中的操作,该类含有具体的算法。
二、策略模式的通用代码
抽象策略角色
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();
}
}
三、策略模式的优缺点和使用场景
策略模式的优点:
- 算法可以自由切换
- 避免使用多重条件判断
- 扩展性良好
策略模式的缺点:
- 策略类数量增多
每一个策略类都是一个类,复用的可能性很小,类数量增多。
- 所有策略类都需要对外暴露
上层模块必须知道有哪些策略,然后才能决定使用哪一个策略,这与迪米特法则是相违背的。
策略模式的使用场景:
- 多个类只有在算法或行为上稍有不同的场景
- 算法需要自由切换的场景
- 需要屏蔽算法规则的场景
四、策略模式的扩展
策略枚举的定义:
- 它是一个枚举
- 他是一个浓缩了策略模式的枚举
public enum Calculator {
//加法运算
ADD("+") {
public int exec(int a, int b) {
return a + b;
}
},
//减法运算
SUB("-") {
public int exec(int a, int b) {
return a - b;
}
};
//声明一个抽象函数
public abstract int exec(int a, int b);
}
策略模式是一个非常优秀和方便的模式,但是它受策略枚举类型的限制,每个枚举项都是 public static final 的,扩展性受到一定的约束。