介绍
策略模式就是把定义的一系列的算法,封装起来,然后根据用户的需求来决定采用哪个算法,并且算法的修改对用户也没影响。
策略模式UML图.png
举例
我们定义了一个整型数组,数组里面的整数都是没有顺序的,然后用户的需求是打算,从小到大排列。然后根据用户的需求来决定采用哪种算法来排序。每个算法之间也可以相互替换,并且这种替换对于用户来说是没有影响的。
策略模式代码
- 抽象策略接口:排序接口
public interface ISort {
public int[] sort(int[] strArray);
}
- 具体策略1:直接插入排序
/**
* @description 直接插入排序
*
* @author sunpy
* @date 2018年10月21日 下午8:08:15
*/
public class DirectInsertSort implements ISort{
@Override
public int[] sort(int[] strArray) {
for (int i = 1 ; i < strArray.length ; i++) {
int nowValue = strArray[i];
int j = i - 1;
while (j >= 0 && nowValue < strArray[j]) {
strArray[j + 1] = strArray[j];
j--;
}
strArray[j + 1] = nowValue;
}
return strArray;
}
}
- 具体策略2:冒泡排序
/**
* @description 冒泡排序
*
* @author sunpy
* @date 2018年10月21日 下午8:08:05
*/
public class BubbleSort implements ISort{
@Override
public int[] sort(int[] strArray) {
for (int i = 0 ; i < strArray.length ; i++) {
for (int j = i + 1 ; j < strArray.length ; j++) {
if (strArray[i] > strArray[j]) {
int temp = strArray[i];
strArray[i] = strArray[j];
strArray[j] = temp;
}
}
}
return strArray;
}
}
- 引用策略类
/**
* @description 引用策略类
*
* @author sunpy
* @date 2018年10月21日 下午8:07:40
*/
public class SortQuote {
private ISort iSort;
public SortQuote(ISort iSort) {
this.iSort = iSort;
}
public int[] useSort(int[] strArray) {
return iSort.sort(strArray);
}
}
测试:
public class MyTest {
public static void printArr(int[] arr) {
for (int i : arr) {
System.out.print(i);
}
}
public static void main(String[] args) throws Exception {
int[] arr = {2,6,7,1,3,8,4,5};
SortQuote sq1 = new SortQuote(new DirectInsertSort());
SortQuote sq2 = new SortQuote(new BubbleSort());
int[] arr1 = sq1.useSort(arr);
printArr(arr1);
System.out.printf("\n");
int[] arr2 = sq2.useSort(arr);
printArr(arr2);
}
}
结果.png
总结
策略模式是一种定义一系列算法的方法,并且这些算法都完成相同的工作,只是实现不同,使用相同的方式调用所有的算法,减少了算法之间的耦合,并且每个算法都是独立的,可以对每个算法的接口进行单独的测试。
网友评论