策略模式(Strategy)

思想概要

软件无非就是数据和算法,或者叫状态和行为。当你发现某些类他们拥有同样的数据而仅仅是行为不同的话,你第一时间肯定就想把这些类的数据独立到一个类,而算法分离到不同的类中,然后根据具体情况再把数据和算法动态的结合起来,这就是策略模式要处理的基本问题模型。在JDK中我们常常使用的容器排序就是个典型策略模式,列表或者Map在排序时需要用户指定Comparator,这就是让用户自己指定排序算法。举个我自己经历的例子:在某个项目中有两种方式来处理图片,一种是opencv,一种是ImageIO,虽然这两个库的具体用法不同,但是你要处理的图片是一样的,而你想要在某些前提条件变化时选择他们中的任一种来处理这张图片。这就是典型的数据一致但是算法不一致的具体场景,你完全可以把保存图片路径,类型信息的类和使用类库处理图片的类分开,在条件判断里把它们合并起来。

上图就是策略模式的类图,拥有数据信息的是Context类,它包含了一个Staregy的接口引用,并在需要对数据处理的时候调用这个引用的API进行数据处理。而真实的算法类则是在条件判断中通过Context的构造函数设置到Context类中去的。

public static void main(String[] args) {
    Context context = null;
    if (isOpenCvActive()) {
        context = new Context(new ConcreteStategyA());
    } else {
        context = new Context(new ConcreteStategyB());
    }
}

 

posted @ 2018-09-10 16:44  Mubawa  阅读(210)  评论(0编辑  收藏  举报