模式动机
- 为了完成某一项任务,往往有多种不同的方式,每一种方式称为一个策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。
- 在软件系统中,有许多算法可以实现某一功能,如查找,排序等,一种常用的方法是硬编码,就是在一个类中提供多个方法,每一个方法对应一个具体的查找算法,也可以将这些查找算法封装在一个统一的方法中,通过if。。else。。等条件判断语句来进行选择。这两种实现方法我们称之为硬编码。这种方式若要增加一种新的查找算法,需要修改源代码。维护起来非常麻烦。
模式定义
- 策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让他们可以互相替换,策略模式让算法独立于它的客户而变化。是一种对象行为型模式。
模式结构

- Context:环境类
- Strategy:抽象策略类
- ConcreteStrategy:具体策略类
模式分析
- 这个模式是一个很容易理解和使用的模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里边,作为一个抽象策略类的子类。
- 这个模式中,由客户端自己决定在什么情况下使用什么具体策略角色。
模式实例
- 有三个排序算法,客户端可以随便选择一个算法对一组数排序。

public class ArrayHandler {
private Sort sort;
public void setSort(Sort sort) {
this.sort = sort;
}
public void sort(int []arry){
sort.sort(arry);
}
}
public interface Sort {
void sort(int[] arr);
}
class BubbleSort implements Sort{
@Override
//这里没有实现具体的排序算法
public void sort(int[] arr) {
}
}
class InsertionSort implements Sort{
@Override
public void sort(int[] arr) {
}
}
class SelectionSort implements Sort{
@Override
public void sort(int[] arr) {
}
}
- 上边的代码并没有实现具体的排序方法,这里由于时间紧迫只是做了一个大致结构。
模式优缺点
- 优点
- 缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一种。
- 策略模式将产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。
模式适用环境和应用
- 适用环境
- 一个体系需要动态的在几种算法中选择一种
- 不希望客户端知道复杂的,与算法相关的数据结构,在具体策略类中封装算法和相关的数据结构,提高算法的保密性与安全性
- 应用
- Java SE的容器布局管理就是策略模式的一个经典实例。
策略模式与状态模式的区别
- 使用策略模式时,客户端无需知道所选的具体策略是哪一个,而使用状态模式时,客户端无需关系具体状态,环境类的状态会根据用户的操作自动更换。
- 如果系统中某个类的对象存在多种状态,不同状态下行为有差异,而且这些状态之间可以发生转换时使用状态模式;如果系统中某一行为存在多种实现方式,而且这些实现方式可以互换时使用策略模式。