策略模式的定义
策略模式(Strategy Pattern)是一种比较简单的设计模式,也叫做政策模式(Policy Pattern)。 其定义如下:
Define a family of algorithms, encapsulate each one and make them interchangeable. 即:定义一组算法,将每个算法都封装起来,并使他们之间可以互换。策略模式的通用类图如下:
![](https://img.haomeiwen.com/i53727/3a98b4148addd815.jpg)
策略模式使用的就是面向对象的继承和多态机制,非常简单,下面介绍策略模式中的三个角色:
- Context封装角色。也叫上下文角色,起了承上启下的封装作用,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。
- Strategy抽象策略角色。定义每个策略或算法必有的方法和属性。
- ConcreteStrategy具体策略角色。实现抽象策略中的操作,包含具体的算法和策略实现。
策略模式通用代码如下:
//抽象策略角色
public abstract interface Strategy{
//策略模式的策略过程
public void doSomething();
}
//具体策略角色1
public class Strategy1 implements Strategy{
@Override
public void doSomething() {
System.out.println("Strategy 1 doSomething...");
}
}
//具体策略角色2
public class Strategy2 implements Strategy{
@Override
public void doSomething() {
System.out.println("Strategy 2 doSomething...");
}
}
//封装角色
public class Context{
//策略角色
private Strategy strategy = null;
public Context(Strategy strategy){
this.strategy = strategy;
}
public void doAnything(){
this.strategy.doSomething();
}
}
//客户端
public class StrategyClient{
public static void main(String[] args) {
//声明一个具体的策略
Strategy strategy1 = new Strategy1();
Context context = new Context(strategy1);
context.doAnything();
System.out.println("-------------------");
Strategy strategy2 = new Strategy2();
context = new Context(strategy2);
context.doAnything();
}
}
策略模式的应用
策略模式的优点
- 算法可以自由切换。这是策略模式本身定义的。
- 避免使用多重条件判断。
- 扩展性良好。
策略模式的缺点
- 策略类数量曾多,每一个类都是一个策略,复用的可能性很小,类数量增多。
- 所有的策略都必须对外暴露
策略模式的使用场景
- 多个类只有在算法或行为上稍有不同的场景。
- 算法需要自由切换的场景。
- 需要屏蔽算法规则的场景。
《注》以上内容总结自秦小波-《设计模式之禅》,仅为个人学习笔记。
网友评论