软件设计模式之策略模式

一、应用场景

1、软件系统中有多个功能类似的算法,系统根据不同的时机来选择不同的算法完成某个功能;
2、不需要让客户端知道复杂的,与算法相关的数据结构;
3、在软件系统中有很多的行为,如果不采取一定的模式,这些行为就只能使用多重的条件语句来实现。

二、策略模式定义

策略模式(Strategy Pattern):策略模式定义了一系列的算法,并将每个算法封装起来,并让它们相互替换。策略模式让算法独立于使用它的客户端而变化。

三、UML图(来自大话设计模式)

软件设计模式之策略模式_第1张图片

四、代码实现

假设某个学生管理系统中有一个这样的功能:根据学生某个学科成绩来排名,但是学生人数不定,得根据学生数目来使用不同的排序算法,假如可供选择的排序算法有冒泡排序、选择排序、插入排序。

排序算法公共接口:

public interface Sort {
    public void sort(int arr[]);
}

冒泡排序:

public class MaoPaoSort implements Sort {
    @Override
    public void sort(int[] arr) {
        System.out.println("冒泡排序");
    }
}

选择排序:

public class ChooseSort implements Sort {
    @Override
    public void sort(int[] arr) {
        System.out.println("选择排序");
    }
}

插入排序:

public class InsertSort implements  Sort {
    @Override
    public void sort(int[] arr) {
        System.out.println("插入排序");
    }
}

Context类:

public class SortContext {
    private  Sort sort;
    public Sort getSortAlgorithm(int arr[]){
        if(arr.length<5){
            sort = new MaoPaoSort();
        }else if(arr.length<10){
            sort = new ChooseSort();
        }else if(arr.length<15){
            sort = new InsertSort();
        }
        return sort;
    }
}

客户端:

public class Client {
    public static void main(String[] args) {
        int arr[] = {1,2,3,4,3,2,1,56,7,7};
        SortContext context = new SortContext();
        Sort sort = context.getSortAlgorithm(arr);
        sort.sort(arr);
    }
}

从上面代码可以看出,策略模式包含四个部分,即公共接口(Sort),具体策略类(InsertSort,ChooseSort以及MaoPaoSort)、上下文类(SortContext)以及客户端类。上下文类的作用很明显,即根据不同的条件来为客户端提供不同的排序算法,在上述代码中的写法是一种比较优的写法,将所有的判断条件都放在Context类中,降低客户端类的复杂程度,这是一种结合简单工厂模式的一种写法。

个人感觉这里的策略模式和简单工厂模式有很大的相似之处,简单工厂模式也是将不同的算法封装起来,但是两者的侧重点不同。简单工厂模式侧重的是“工厂”的作用,即生产线准备好,然后直接生产对象,更多着重的是“流水线”式的生产,当需要某个产品时开动生产线生产就行,不用再关心内部的实现细节;而策略模式更加着重的是对策略的封装以及策略之间的替换,根据不同的条件做到随时可以悄无声息的替换。

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