设计模式——策略模式

2016-08-24  本文已影响0人  蜗牛的赛跑

定义:策略模式定义了一系列算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.

�使用场景:我们要对一串数字进行排序,�并且能够选择排序算法.
那么就会产生许多不同的策略来解决排序问题
我们可以把策略的公共部分提取出来,成为抽象策略类,然后再去实现各个具体策略类.然后使用工具类,可以聚合抽象策略类
代码如下

//抽象策略类
public interface Algorithm {

    void sort(int[] numbers);
}

//具体的策略类
public class QuickSort implements Algorithm {
    @Override
    public void sort(int[] numbers) {
        if(numbers != null){
            quickSort(numbers, 0, numbers.length-1);
        }

    }

    private static void quickSort(int[] array,int beg,int end){
        if(beg >= end || array == null)
            return;
        int p = partition(array, beg, end);
        quickSort(array, beg, p-1);
        quickSort(array, p+1, end);
    }

    private static int partition(int[] array, int beg, int end) {
        int first = array[beg];
        int i = beg, j = end;
        while (i < j) {
            while (array[i] <= first && i < end) {
                i++;
            }
            while (array[j] > first && j >= beg) {
                j--;
            }
            if (i < j) {
                array[i] = array[i] ^ array[j];
                array[j] = array[i] ^ array[j];
                array[i] = array[i] ^ array[j];
            }
        }
        if (j != beg) {
            array[j] = array[beg] ^ array[j];
            array[beg] = array[beg] ^ array[j];
            array[j] = array[beg] ^ array[j];
        }
        return j;
    }


}


public class SortUtil {

    private static class SortUtilHolder{
        private static final SortUtil INSTANCE = new SortUtil();
    }

    private Algorithm algorithm;

    private SortUtil(){}

    public static SortUtil getInstance(){
        return SortUtilHolder.INSTANCE;
    }

    public void setAlgorithm(Algorithm algorithm) {
        this.algorithm = algorithm;
    }

    public void sort(int[] numbers){
        if(algorithm != null){
            algorithm.sort(numbers);
        }
    }
}

策略模式的UML如下图


其中SortUtil相当于Context,Algorithm相当于Strategy,而QuickSort则是Algorithm的实现类.
这其实也是OOP六大原则中的典型的依赖倒置
通过替换Algorithm来达到替换策略.
说到底其实策略模式就是面向接口编程的体现,通过接口和继承替换了方法

上一篇下一篇

猜你喜欢

热点阅读