软件设计模式之策略模式
一、应用场景
1、软件系统中有多个功能类似的算法,系统根据不同的时机来选择不同的算法完成某个功能;
2、不需要让客户端知道复杂的,与算法相关的数据结构;
3、在软件系统中有很多的行为,如果不采取一定的模式,这些行为就只能使用多重的条件语句来实现。
二、策略模式定义
策略模式(Strategy Pattern):策略模式定义了一系列的算法,并将每个算法封装起来,并让它们相互替换。策略模式让算法独立于使用它的客户端而变化。
三、UML图(来自大话设计模式)
四、代码实现
假设某个学生管理系统中有一个这样的功能:根据学生某个学科成绩来排名,但是学生人数不定,得根据学生数目来使用不同的排序算法,假如可供选择的排序算法有冒泡排序、选择排序、插入排序。
排序算法公共接口:
public interface Sort {
public void sort(int arr[]);
}
冒泡排序:
public class MaoPaoSort implements Sort {
@Override
public void sort(int[] arr) {
System.out.println("冒泡排序");
}
}
选择排序:
public class ChooseSort implements Sort {
@Override
public void sort(int[] arr) {
System.out.println("选择排序");
}
}
插入排序:
public class InsertSort implements Sort {
@Override
public void sort(int[] arr) {
System.out.println("插入排序");
}
}
Context类:
public class SortContext {
private Sort sort;
public Sort getSortAlgorithm(int arr[]){
if(arr.length<5){
sort = new MaoPaoSort();
}else if(arr.length<10){
sort = new ChooseSort();
}else if(arr.length<15){
sort = new InsertSort();
}
return sort;
}
}
客户端:
public class Client {
public static void main(String[] args) {
int arr[] = {1,2,3,4,3,2,1,56,7,7};
SortContext context = new SortContext();
Sort sort = context.getSortAlgorithm(arr);
sort.sort(arr);
}
}
从上面代码可以看出,策略模式包含四个部分,即公共接口(Sort),具体策略类(InsertSort,ChooseSort以及MaoPaoSort)、上下文类(SortContext)以及客户端类。上下文类的作用很明显,即根据不同的条件来为客户端提供不同的排序算法,在上述代码中的写法是一种比较优的写法,将所有的判断条件都放在Context类中,降低客户端类的复杂程度,这是一种结合简单工厂模式的一种写法。
个人感觉这里的策略模式和简单工厂模式有很大的相似之处,简单工厂模式也是将不同的算法封装起来,但是两者的侧重点不同。简单工厂模式侧重的是“工厂”的作用,即生产线准备好,然后直接生产对象,更多着重的是“流水线”式的生产,当需要某个产品时开动生产线生产就行,不用再关心内部的实现细节;而策略模式更加着重的是对策略的封装以及策略之间的替换,根据不同的条件做到随时可以悄无声息的替换。