美文网首页
行为型模式之策略模式

行为型模式之策略模式

作者: sunpy | 来源:发表于2018-10-21 20:33 被阅读6次

介绍

策略模式就是把定义的一系列的算法,封装起来,然后根据用户的需求来决定采用哪个算法,并且算法的修改对用户也没影响。


策略模式UML图.png

举例

我们定义了一个整型数组,数组里面的整数都是没有顺序的,然后用户的需求是打算,从小到大排列。然后根据用户的需求来决定采用哪种算法来排序。每个算法之间也可以相互替换,并且这种替换对于用户来说是没有影响的。

策略模式代码

  1. 抽象策略接口:排序接口
public interface ISort {
    
    public int[] sort(int[] strArray);
}
  1. 具体策略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;
    }
}
  1. 具体策略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;
    }
}
  1. 引用策略类
/**
 * @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

总结

策略模式是一种定义一系列算法的方法,并且这些算法都完成相同的工作,只是实现不同,使用相同的方式调用所有的算法,减少了算法之间的耦合,并且每个算法都是独立的,可以对每个算法的接口进行单独的测试。

相关文章

网友评论

      本文标题:行为型模式之策略模式

      本文链接:https://www.haomeiwen.com/subject/gtqizftx.html