策略模式(Strategy)
定义
策略(Strategy)模式的定义: 该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
应用情景
在我们开发过程中肯定会遇到使用一个算法时可能要引入或返回不同的类型,若使用if...else
则会使代码看起来繁琐多余。那么就可以通过将这些算法封装成一个一个的类,使其可以根据需要任意地替换。
只看理论比较难理解,我通过java程序来举例子:
public class Main {
public static void main(String[] args) {
int[] a = {5, 7, 3, 1};
Strategy sorter = new Strategy();
sorter.sort(a);
System.out.println(Arrays.toString(a));
}
}
//排序算法
class Strategy{
public void sort(int[] a) {
for (int i = 0; i < a.length-1; i++) {
int index = i;
for (int j = i+1; j < a.length; j++) {
index = a[j] < a[index] ? j : index;
}
int temp = a[i];
a[i] = a[index];
a[index] = temp;
}
}
}
比如我们通过上面的程序可以对int数组进行排序,若是想让这个程序也能对double类型的数组进行排序,我们就需要在Sorter类中在重写一个sort(double[] a)
方法并将参数类型换成double。若想比较其他类型以此类推,使用户可以根据自己的需要来使用。这就是一种简单的策略模式。
使用comparable优化
通过上面的举例可以看出,这样封装一系列的算法会使代码繁杂多余,那么这里就可以用到
Comparable
类型进行比较,减少代码量。
关于comparable
的用法参考javase官方文档。
我们把参数类型改成Comparable
类型,判断使用compareTo()
方法,对排序代码优化:
class Strategy {
public void sort(Comparable[] a) {
for (int i = 0; i < a.length-1; i++) {
int index = i;
for (int j = i+1; j < a.length; j++) {
index = a[j].compareTo(a[index]) == -1 ? j : index;
}
Comparable temp = a[i];
a[i] = a[index];
a[index] = temp;
}
}
}
因为Comparable
只会根据<、=、>返回结果-1、0、1,排序方法只需要根据比较结果来进行判断,所有就不需要根据用户想使用的类型来更改参数。
策略模式结构
策略类型结构如下:
- 策略类中包含可能用到的不同参数类型的策略方法
- 程序调用策略方法使用不同的参数
优点:
- 代码重复率低,易扩展。
- 可以将公共代码写入父类,子类重写策略来提高代码灵活性。
- 遵循开闭原则
最近清明放假没更新学习文章,主要是因为生病了要做个小手术,再加上身在外地想回家看看了。大家要多注意身体啊,,