Stategy模式

      Stategy模式(策略模式)是一种定义一系列算法的方法,但这些算法都有一个共同的功能,只是它们实现的过程不同,从而减少了各算法类与使用算法类之间的耦合性。

 

     现在我们用Stategy模式进行实现一个排序,先看下面的UML图

 

      Stategy模式_第1张图片

    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");

	}

}

 

 结果


Stategy模式_第2张图片

 

策略模式好处大大减少了算法类与使用算法类的耦合性。若新增一个新的排序法,只需实现Sort接口,扩展性强。

 

你可能感兴趣的:(模式)