当我们在实现一个功能的时候,有很多种的实现方式,比如说排序算法,有快速排序、冒泡排序、插入排序等等。可能我们的做法是将方法放到一个类中,或者是用if...else..语句来判断,但是显然违背了OCP原则和单一职责原则,并且如果有新的实现方式需要添加,就要去改动整个类,大大加深了维护难度。
定义:
策略模式定义了一系列的算法,并且将之封装起来,而且各个算法可以相互替换。
我们常使用的MVP模式中的Presenter层就是对策略模式的实现,一个View在不同的条件下,可以对应不同的Presenter层。
类图:
Context是用来操作策略的类,里面有个setStragety方法,可以设置不同的策略类进去(StragetyA或者StragetyB)。设置不同的策略类就能实现不同的algorithm算法了。
Android源码中的应用:
动画中的TimeInterpolator(时间插值器)
有几种不同的实现策略:
线性插值器(LinearInterpolator)
加速插值器(AccelerateDecelerateInterpolator)
减速插值器(DecelerateInterpolator)
类图:
可以看出来Interpolator就是策略抽象,而各种具体的XxxInterpolator就是具体实现的策略类。
开发中的实际应用MVP模式中用到的策略模式
讲解:比如我们有一个比赛数据展示的页面View,有篮球、足球、乒乓球等的数据需要展示,View的展示方式是一样的,但是去网络请求数据的参数,以及数据回来需要做一点处理的逻辑篮球、足球、乒乓球却不同。
于是我们可以定义一个BasePresenter,里面有一个抽象的loadData方法。
在具体的策略实现子类中可以根据自己的情况去loadData,并且处理Data,处理完毕后,通过View中的refreshVeiw(Data data)方法返回数据,通知View更新界面。
优点:
结构清晰明了、使用简单直观
耦合度降低,扩展方便
操作封装更为彻底,数据更为安全
缺点:
类的数量增加。