系列文章目录
前言
完成一项任务,往往可以有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。在软件开发中也常常遇到类似的情况,实现某一个功能有多个途径,此时可以使用一种设计模式来使得系统可以灵活地选择解决途径,也能够方便地增加新的解决途径。
一、策略模式
策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)
二、主要角色
- Context: 环境类
- Strategy: 抽象策略类
- ConcreteStrategy: 具体策略类
三、示例代码
策略接口:
public interface IStrategy {
/**
* 策略模式的运算法则
*/
public void doSomething();
}
然后是具体的策略实现类:
public class ConcreteStrategy1 implements IStrategy {
@Override
public void doSomething() {
System.out.println("具体策略的策略方法1");
}
}
public class ConcreteStrategy2 implements IStrategy {
@Override
public void doSomething() {
System.out.println("具体策略的策略方法2");
}
}
封装角色的类:
public class Context {
// 抽象策略
private IStrategy strategy;
/**
* 构造函数设置具体策略
* @param strategy
*/
public Context(IStrategy strategy) {
this.strategy = strategy;
}
/**
* 封装后的策略方法
*/
public void doAnything() {
this.strategy.doSomething();
}
}
客户端的调用策略类:
public class Client {
public static void main(String[] args) {
// 声明一个具体的策略
IStrategy strategy = new ConcreteStrategy1();
// 声明上下文对象
Context context = new Context(strategy);
// 执行封装后的方法
context.doAnything();
}
}
四、优缺点
1. 优点
- 策略模式提供了对“开闭原则”的完美支持,用户可以在不修改原有系统的基- 础上选择算法或行为,也可以灵活地增加新的算法或行为。
- 策略模式提供了管理相关的算法族的办法。
- 策略模式提供了可以替换继承关系的办法。
- 使用策略模式可以避免使用多重条件转移语句。
2. 缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
- 策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。
3. 适用场景
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
- 一个系统需要动态地在几种算法中选择一种。
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
- 不希望客户端知道复杂的、与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性。
五、策略模式在Spring源码中应用
【Spring源码解析】—— 策略模式在Spring中的应用