[0006]iOS设计模式iOS-设计模式iOS-OC中级

iOS设计模式之策略模式、状态模式

2017-04-27  本文已影响58人  3697d6c42285

委托模式与状态模式

由于策略模式与状态模式有一定的共同性,所以我把两种模式放在一起讨论。

同时我在知乎上发现一个回答,感觉讲的很好:https://www.zhihu.com/question/23693088


什么是策略模式

策略模式简单来说是将多个算法封装起来使用,将所有支持、相关的算法都声明到一个共同接口。将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化。策略模式与状态模式有些类似。

什么是状态模式

状态模式允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

策略模式和状态模式用在什么地方

  1. 当某个类的某个方法中,需要许多的条件语句(if\else或者switch的)来执行不同的动作时候;
  2. 避免把复杂的、与算法有关的数据暴露出来.

策略模式和状态模式的共同点

  1. 都是在多行为的情况下使用
  2. 通过子类实现不同的算法
  3. 接口统一

策略模式和状态模式的不同点

策略模式 状态模式
没有状态变量 有状态变量
通过外界注入实现不同的算法 通过内部状态实现不同算法
更改时无需切换状态 更改则需要切换状态

策略模式的使用

  1. 创建实现父类,定义方法;
  2. 通过实现父类,创建详细子类并实现方法;
  3. 通过传入对象的不同,接口执行不同的操作。

状态模式的使用

  1. 创建策略父类,定义方法;
  2. 通过策略父类,创建详细子类并实现方法;
  3. 设置本身的状态;
  4. 根据本身状态的不同,接口执行不同的操作。

总结

从个人的使用情况来看,策略模式与状态模式的差别并不算大,甚至在UML图都很类似,主要的差别在于:

状态模式相对而言比较固定,是通过本身的状态实现动作,如果想要进行不同的动作则需要切换状态。

而策略模式则更加的灵活,需要根据每次传入参数的不同实现的不同动作。

不过在 iOS 当中,可以把所有的父类作为协议,在子类中实现协议功能。

例子

有一天,你的产品经理过来跟你说需要一个计算矩形(rect)面积(getArea)与周长(getPerimeter)的功能,然后你就利索的写了计算返回方法。

又过了几天,你的产品经理又过来跟你说,不但需要计算矩形,还需要判断如果面积大于50,那么就限定为50,并把宽高按比例缩小。于是你就增加了一个方法(calculateArea),用来得到限定之后的面积。

通过策略模式,将 calculateAreaWithShape: 方法写入策略父类中,作为方法定义,不实现功能。定义 rect、circle、triangle 等的父类(shape),实现计算面积和周长的定义。并在策略类中实现对 shape 子类的调用。

若通过状态模式,则在父类中定义 calculateArea 方法.并增加 shape 属性.其余与策略模式相同.

demo

关于 demo 的话,这次懒得写了,想看具体案例的话可以看看这篇文章:http://www.jianshu.com/p/014df9e21c35

上一篇下一篇

猜你喜欢

热点阅读