策略模式

1、策略模式的动机

2、策略模式的定义

策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化, 也称为政策模式(Policy)。策略模式是一种对象行为型模式

3、策略模式的类结构图

image

分析如下:

4、优缺点和适用场景

优点:

缺点:

适用场景:

5、实例

例:多重排序算法策略;
策略抽象类:

public interface SortStrategy {
    int[] sort(int[] a);
}

选择排序算法:

public class SelectSortStrategy implements SortStrategy {

    public int[] sort(int[] a) {
        if (a == null || a.length == 0) {
            return a;
        }
        int t;
        for(int i = 0; i < a.length-1; i++) {
            for(int j = i + 1; j < a.length; j++) {
                if (a[i] > a[j]) {
                    t = a[i];
                    a[i] = a[j];
                    a[j] = t;
                }
            }
        }
        return a;
    }
}

插入排序:

public class InsertSortStrategy implements SortStrategy {
    public int[] sort(int[] a) {
        if (a == null || a.length == 0) {
            return a;
        }
        for(int i = 1; i < a.length; i++) {
            int t = i;
            int m = a[i];
            for(int j = i - 1; j >= 0; j--) {
                if (a[j] > m) {
                    a[j + 1] = a[j];
                    t--;
                }
            }
            a[t] = m;
        }
        return a;
    }
}

环境类:

public class StrategyContext {
    private SortStrategy sortStrategy;

    public void setSortStrategy(SortStrategy sortStrategy) {
        this.sortStrategy = sortStrategy;
    }

    public int[] sort(int[] a) {
        return sortStrategy.sort(a);
    }
}

测试

public class Test {
    public static void main(String[] args) {
        StrategyContext strategyContext = new StrategyContext();
        strategyContext.setSortStrategy(new SelectSortStrategy());
        int[] a = { 3, 23, 12, 43, 123, 1 };
        a = strategyContext.sort(a);
        for(int b : a) {
            System.out.println(b);
        }
    }
}