iOS设计模式之策略模式、状态模式
委托模式与状态模式
由于策略模式与状态模式有一定的共同性,所以我把两种模式放在一起讨论。
同时我在知乎上发现一个回答,感觉讲的很好:https://www.zhihu.com/question/23693088
什么是策略模式
策略模式简单来说是将多个算法封装起来使用,将所有支持、相关的算法都声明到一个共同接口。将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化。策略模式与状态模式有些类似。
什么是状态模式
状态模式允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
策略模式和状态模式用在什么地方
- 当某个类的某个方法中,需要许多的条件语句(if\else或者switch的)来执行不同的动作时候;
- 避免把复杂的、与算法有关的数据暴露出来.
策略模式和状态模式的共同点
- 都是在多行为的情况下使用
- 通过子类实现不同的算法
- 接口统一
策略模式和状态模式的不同点
策略模式 | 状态模式 |
---|---|
没有状态变量 | 有状态变量 |
通过外界注入实现不同的算法 | 通过内部状态实现不同算法 |
更改时无需切换状态 | 更改则需要切换状态 |
策略模式的使用
- 创建实现父类,定义方法;
- 通过实现父类,创建详细子类并实现方法;
- 通过传入对象的不同,接口执行不同的操作。
状态模式的使用
- 创建策略父类,定义方法;
- 通过策略父类,创建详细子类并实现方法;
- 设置本身的状态;
- 根据本身状态的不同,接口执行不同的操作。
总结
从个人的使用情况来看,策略模式与状态模式的差别并不算大,甚至在UML图都很类似,主要的差别在于:
状态模式相对而言比较固定,是通过本身的状态实现动作,如果想要进行不同的动作则需要切换状态。
而策略模式则更加的灵活,需要根据每次传入参数的不同实现的不同动作。
不过在 iOS 当中,可以把所有的父类作为协议,在子类中实现协议功能。
例子
有一天,你的产品经理过来跟你说需要一个计算矩形(rect)面积(getArea)与周长(getPerimeter)的功能,然后你就利索的写了计算返回方法。
又过了几天,你的产品经理又过来跟你说,不但需要计算矩形,还需要判断如果面积大于50,那么就限定为50,并把宽高按比例缩小。于是你就增加了一个方法(calculateArea),用来得到限定之后的面积。
通过策略模式,将 calculateAreaWithShape: 方法写入策略父类中,作为方法定义,不实现功能。定义 rect、circle、triangle 等的父类(shape),实现计算面积和周长的定义。并在策略类中实现对 shape 子类的调用。
若通过状态模式,则在父类中定义 calculateArea 方法.并增加 shape 属性.其余与策略模式相同.
demo
关于 demo 的话,这次懒得写了,想看具体案例的话可以看看这篇文章:http://www.jianshu.com/p/014df9e21c35