策略模式与状态模式

1、定义

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

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类

2、使用场景

策略模式:
1)、针对同一类型问题的多种处理方式,仅仅是具体行为有差别时
2)、需要安全地封装多种同一类型的操作时
3)、出现同一抽象类有多个子类,而又需要使用if-else或者switch-case来选择具体子类时
4)、根据里式替换原则,任何出现父类的地方都可以使用它的子类去替换,这样符合我们的业务需求
状态模式:
1)、一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为
2)、代码中包含大量的与对象状态有关的条件语句

3、实例分析

策略模式
策略模式通常在商场打折,公交换乘等场景下比较普遍

这个实例主要参考这篇文章,需要知道细节的可以查看《JAVA与模式》之策略模式
Android中的策略模式举例:
1、Android中通过对Animation对象设置不同的插值器来设置不同的动态效果,这其中就使用到了不同的插值器(定义一个动画的变化率)算法
备注:分析的Android源码的版本为6.0 API 24

2、属性动画中另外一个应用策略模式的地方就是估值器(TypeEvaluator是一个接口),它的作用是根据当前属性改变的百分比来计算改变后的属性值。该属性和插值器是类似的,有几个默认的实现。
3、Volley框架中的重试策略接口
4、各大图片缓存库(ImageLoader、Picasso、Glide、Fresco)的图片缓存加载策略等等
5、定制带有不同Indicator(圆形、线性、Tab、图标等等)的ViewPager
状态模式
策略模式的行为是彼此独立的,可相互替换的,但是状态模式的行为却是平行的,不可替换的
例如电视在开机状态和关机状态下的行为操作是平行存在的
Android中的状态模式举例:
1、Wi-Fi管理中的状态模式
2、Android中的StateMachine机制就是一个State模式的应用,可以处理多状态的复杂场景,强大而精妙
在《Android源码设计模式解析与实战》一书中有一个很实用的例子能够让我们比较通俗地理解状态模式
即:用户登录系统,在用户已登录和未登录的情况下,对于同一事件的处理行为是不一样的
场景是这样的:
在新浪微博中,用户在未登录的情况下点击转发按钮,此时会先让用户登录,然后再执行转发操作。如果是已经登录的情况下,那么用户输入转发的内容后就可以直接进行操作。可见,在这两种状态下,对于转发这个操作的处理是完全不一样的,当状态改变时,对于转发操作的行为发生了改变
当对象的行为随对象的状态的改变而改变时,我们为了解耦多重判断条件,封装行为的变化,可以定义一个抽象的状态类,提供对象行为接口。具体与状态相关的行为,由它的子类去实现

4、优缺点

策略模式的优点
结构清晰明了、使用简单直观
耦合度相对而言较低,扩展方便
操作封装也更为彻底,数据更为安全
策略模式的缺点
随着策略的增加,子类也会变得繁多
状态模式的优点
状态模式将所有与一个特定的状态相关的行为都放入一个状态对象中,它提供了一个更好的方法来组织与特定状态相关的代码,将繁琐的状态判断转换成结构清晰的状态类族,在避免代码膨胀的同事也保证了可扩展性与可维护性
状态模式的缺点
状态模式的使用必然会增加系统类和对象的个数

5、参考

《Android源码设计模式解析与实战》
发布了97 篇原创文章 · 获赞 87 · 访问量 32万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览