1.策略模式
策略模式是对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
2.策略模式的结构
参与角色:
- Context:环境角色,持有一个引用,并给客户端提供一个方法,调用策略。
- Strategy:抽象策略角色,定义所有策略算法的公共接口,给Context调用提供一个统一的接口。
- StrategyImplA/B/C:具体策略角色,实现一个具体的策略。
3.示例代码:
Strategy.java
public abstract class Strategy {
/**
* 統一操作
*/
public abstract void operation();
}
StrategyImplA.java
public class StrategyImplA extends Strategy {
@Override
public void operation() {
System.out.println("第一种操作");
}
}
Context.java
/**
* 环境角色,保存一个策略引用,也可以保存一些环境数据,供策略使用
* @author chenxh
*
*/
public class Context {
Strategy stra;
public Context(Strategy stra) {
this.stra = stra;
}
//get客户端调用
public void doOperation() {
stra.operation();
}
}
Client.java
public class Client {
public static void main(String[] args) {
Context context = new Context(new StrategyImplA());
context.doOperation();
context = new Context(new StrategyImplC());
context.doOperation();
}
}
运行结果:
第一种操作
第三种操作
第三种操作
4.策略模式的适用场景
- 如果在一个系统中有许多类,他们之间的区别仅在于他们的行为,使用策略模式分离这种行为变化,可以动态让一个对象在许多行为中选择一个行为。
- 一个系统需要动态地在几种算法中选择一种。
- 一个系统的算法使用的数据不可以让客户端知道。策略模式把算法使用的数据封装在策略类中。
- 如果一个对象有很多行为,使用策略模式,把这些模式转移到具体策略类中,防止条件选择语句的出现。
5.策略模式的优点和缺点
策略模式的优点:
- 策略模式提供了管理相关算法族的办法。策略模式的策略继承体系(示例图中只有3个具体策略,而且只有一层结构,实际中可能更多),把公共的代码移到父类中,避免重复代码
- 策略模式用委托代替继承。系统可以动态改变算法的行为
- 避免使用多重条件转移语句
策略模式的缺点:
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
- 策略模式造成很多策略类。可以使用享元模式来减少对象的数量。