设计模式——策略模式

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

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

//抽象策略类
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来达到替换策略.
说到底其实策略模式就是面向接口编程的体现,通过接口和继承替换了方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 Android的设计模式系列文章介绍,欢迎关注,持续更新中: Android的设计模式-设计模式的六大原则一...
    四月葡萄阅读 14,623评论 4 24
  • 定义 策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可...
    步积阅读 774评论 0 2
  • 概念及定义 概念在完成某一功能时,有时需要根据不同环境采取不同的策略或行为。将这些不同的策略或行为(称为算法)一一...
    maxwellyue阅读 573评论 0 0
  • 模式定义 定义一系列算法,将它们一个个封装起来,并且使他们之间可以相互替换。本模式使得算法可以独立于使用它的客户而...
    FX_SKY阅读 254评论 0 0
  • 目录 夜色阑珊篇 01 抬头看看墙上的挂钟,已经五点钟了,办公室里渐渐冷清起来,下班时间到了。 然而季敏今天一点都...
    南歌吟阅读 706评论 8 13