Stategy模式(策略模式)是一种定义一系列算法的方法,但这些算法都有一个共同的功能,只是它们实现的过程不同,从而减少了各算法类与使用算法类之间的耦合性。
现在我们用Stategy模式进行实现一个排序,先看下面的UML图
Sort是提供各类排序方法,InsertSort是插入排序法,BubbleSort是冒泡排序法,SelectSort是选择排序法,但他们都是提供了排序的功能,而且都是从小到大进行排序,Context是个委托调用排序的方法。我们用代码来实现。
先创建接口Sort,里面只提供一个方法,sort
package com.tankiy.Stategy;
import java.util.List;
/**
* <p>Title: Stategy策略模式</p>
*
* <p>Description: 接口</p>
*
* @author Tankiy
* @version 1.0
*/
public interface Sort {
/**
* @param list 需要排序List
* @return 返回排序后
*/
public int[] sort(int[] arrays);
}
实现选择排序法InsertSort
package com.tankiy.Stategy;
import java.util.List;
/**
* <p>Title: Stategy策略模式</p>
*
* <p>Description: 插入排序</p>
*
* @author Tankiy
* @version 1.0
*/
public class InsertSort implements Sort {
public int[] sort(int[] arrays) {
for(int i = 1; i < arrays.length; i++) {
int select = arrays[i];
int j = 0;
//若前一位大于或者等于选择的数,那么则进行交换位置,然后插入
for(j = i; j > 0 && arrays[j - 1] >= select; j--) {
arrays[j] = arrays[j - 1];
}
arrays[j] = select;
}
return arrays;
}
}
冒泡排序
package com.tankiy.Stategy;
import java.util.List;
/**
* <p>Title: Stategy策略模式</p>
*
* <p>Description: 冒泡排序</p>
*
* @author Tankiy
* @version 1.0
*/
public class BubbleSort implements Sort{
public int[] sort(int[] arrays) {
//进行冒泡排序
for(int i = 1; i < arrays.length; i++) {
for(int j = 0; j < i; j++) {
//若前一位大于后一位,进行冒泡交换位置
if(arrays[j] > arrays[i]) {
int temp = arrays[j];
arrays[j] = arrays[i];
arrays[i] = temp;
}
}
}
return arrays;
}
}
选择排序
package com.tankiy.Stategy;
import java.util.List;
/**
* <p>Title: Stategy策略模式</p>
*
* <p>Description: 选择排序</p>
*
* @author Tankiy
* @version 1.0
*/
public class SelectSort implements Sort {
public int[] sort(int[] arrays) {
int min = 0;
//进行选择排序
int top = 0;
for(int i = 0; i < arrays.length - 1; i++) {
min = i;
for(int j = i + 1; j < arrays.length; j++) {
if(arrays[j] < arrays[min]) {
min = j;
}
//获取当前对换的大值
top = arrays[i];
//获取最小的并插入最左边
arrays[i] = arrays[min];
//大值进行切换
arrays[min] = top;
}
}
return arrays;
}
}
委托调用Context
package com.tankiy.Stategy;
/**
* <p>Title: Stategy策略模式</p>
*
* <p>Description: 委托管理</p>
*
* @author Tankiy
* @version 1.0
*/
public class Context {
public Sort sort;
public Context(Sort sort) {
this.sort = sort;
}
public int[] sort(int[] arrays) {
return sort(arrays);
}
}
测试用例
package com.tankiy.Stategy;
import java.util.Random;
/**
* <p>Title: Stategy策略模式</p>
*
* <p>Description: 测试</p>
*
* @author Tankiy
* @version 1.0
*/
public class SortTest {
/**
* @param args
*/
public static void main(String[] args) {
int[] arrays = new int[10];
Random random = new Random();
System.err.print("排序前:");
for(int i = 0; i < arrays.length; i++) {
//随机添加整数
arrays[i] = random.nextInt(10);
System.out.print(arrays[i] + ",");
}
System.err.print("\n");
System.err.print("插入排序:");
Sort bubbleSort = new InsertSort();
Context ctx = new Context(bubbleSort);
arrays = bubbleSort.sort(arrays);
for(int i = 0; i < arrays.length; i++) {
System.out.print(arrays[i] + ",");
}
System.err.println("\n");
}
}
结果
策略模式好处大大减少了算法类与使用算法类的耦合性。若新增一个新的排序法,只需实现Sort接口,扩展性强。