iOS - 在工程中试玩状态模式
做了一个项目,项目中一个藏品详情界面针对不同用户,和用户所处于的状态的不同,展示的效果和操作的权限都会不同。想到了状态模式,从来没有用过,赶紧学一下然后用一用。期待兴奋
看了这么多的博客,终于找到一个可以分享的博客啦,这里
1.事必有因###
我有一个视图层,在这个视图层上展示的效果和操作行为是一个或多个动态变化的属性来决定的,这些属性被称为状态
。
保利藏品库房管理软件中藏品信息展示界面
1.人员分类 :仓库管理员、藏品录入业务员
2.操作状态:观看状态、编辑状态
- 业务员录入藏品状态 —— 可以修改藏品信息,但是不会显示藏品录入时间和业务员信息
- 业务员观看藏品状态 —— 不能修改藏品信息
- 业务员编辑藏品状态 —— 可以修改藏品信息,但是不能修改藏品录入时间和业务员信息
- 管理员观看藏品状态 —— 不能修改藏品信息
- 管理员编辑藏品状态 —— 不能修改藏品信息,只能修改藏品所在仓库的位置
2.方案分析###
状态模式:允许一个对象在自己内部根据状态
改变时来改变自己的行为(展示、权限等)。这个对象开起来似乎修改了自己的类。并且这个对象被叫做有状态的对象,这样的对象状态值是实现定义好的一系列值中取出来的。当一个状态值被对象外部的事件产生改变的时候,状态值就会影响对象内部的行为的改变。
3.使用场景上###
- 出现当量if else场景,想上述的那个需求来说,可想而知用ifelse判断多恐怖😱
4.结构图###
摘自文中开头分享的博客中,大多数状态模式UML都是这个,嘿嘿,原理都是这样的。
Context 环境类: 定义客户感兴趣的接口,维护一个具体状态的子类的实例,这个实例定义当前状态。
State 抽象状态类:定义一个封装好与Context的特定状态相关的行为接口。
ConcreteStates 具体状态类:每一个具体的状态类实现了一个与Context的一个状态相关的行为。
5.状态模式和策略模式的区别###
看了UML都能发现,其实这个类图和策略模式的类图是一样的。
但是他们是很容易去区分的:
- 策略模式是固定算法,Client端直接拿来使用 【PK】状态模式是给Client返回某些状态,让Client端内部改变自己的行为
- 策略模式是被Client主动选择【PK】状态模式是帮忙管理Client不同状态下的行为,如果外力让状态改变,状态模式就会告诉Client它要小心应对了
- 策略模式不会持有Context,因为一般都是Client选择【PK】状态模式需要持有Context