策略模式
概述
结构与简单工厂模式相似,只是Factory换成了Context,简单工厂模式注重的是对象的创建,策略模式注重的是行为的变化。
Context类持有一个父类引用,传入不同的行为实例,则执行不同的行为。
在简单工厂模式中,当需要扩展或变更时,都需要改动工厂类,代码需要重新编译部署。
举例
不同查找算法
涉及的类:Context类、查找父类、二分查找类、顺序查找类
查找父类/接口
interface Search{
    public int search(int target, int[] array);
}  二分查找类
class SearchBinary implements Search{
    public int search(int target, int[] array){
        int index = 0;
        //二分查找算法
        return index;
    }
}  顺序查找类
class SearchSequence implements Search{
    public int search(int target, int[] array){
        int index = 0;
        //顺序查找算法
        return index;
    }
}  Context类
class SearchContext{
    private Search strategy;
    public SearchContext(Search strategy){
        this.strategy = strategy;
    }
    public int getResult(int target, int[] array){
        return strategy.search(target, array);
    }
}  客户端
SearchContext context = null;
String type= "binary";
switch(type){
    case "binary":
        context = new SearchContext(new SearchBinary());
        break;
    case "sequence":
        context = new SearchContext(new SearchSequence());
        break;
    }
}
int target = 1;
int[] array = new int[]{1,2,3};
int result = context.getResult(target, array);  分析
很明显,客户端出现了判断逻辑,那么我们可以将策略模式与简单工厂模式相结合:
class SearchContext{
    private Search strategy;
    public SearchContext(String type){  //参数由具体策略对象变为字符串
        switch(type){
            case "binary":
                strategy= new SearchBinary();
                break;
            case "sequence":
                strategy= new SearchSequence();
                break;
        }
    }
    public int getResult(int target, int[] array){
        return strategy.search(target, array);
    }
}  客户端的代码则简化成:
SearchContext context = new SearchContext("binary");  相比简单工厂模式中,客户端需要认识两个类Factory类和父类,策略模式只需认识一个Context类。
不过这样结合后,也就出现了简单工厂模式的弊端,因为在Context类中用到了switch,扩展时则需要改动Context类。这一问题可用反射来解决,在抽象工厂模式中将会讲到。
