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

89 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情


设计模式相信大家都很熟悉了,但是越是基础的东西也越是需要经常的回顾与思考,于是着手写一个温故而知新的设计模式回顾系列。
在 8 月,准备把各个常用的不常用的设计模式都进行一次回顾,并大概聊一下各个模式的特点与在 iOS 中的大概使用场景与情况。

这里是设计模式回顾的第四篇,委托模式与状态模式的相关回顾。


委托模式与状态模式

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

同时我在知乎上发现一个回答,感觉讲的很好:状态模式和策略模式的区别与联系?


什么是策略模式

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

什么是状态模式

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

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

  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 的话,这次懒得写了,想看具体案例的话可以看看这篇文章:www.jianshu.com/p/014df9e21…