类的行为基于它自身的状态改变,对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
对象的行为依赖于他的状态,并且可以根据状态的改变而改变行为。
使用目的:
(1)需要抽象状态
当代码中包含了大量与对象状态有关的语句时,就可以考虑用状态模式,状态可以在多个类间共享,影响多个类的行为。
(2)状态是有时间范围的
策略和命令都是瞬时的操作,不具有时间跨越性
好处:状态模式封装了状态转换逻辑,枚举了可能的状态,将所有与某个状态有关的逻辑放到了一个状态类里,状态扩展方便
坏处:状态模式对“开闭原则”的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码。
https://www.jianshu.com/p/378ed95e7f0d
这篇讲的很好
状态模式的角色:
-
state状态表示状态,定义了根据不同状态进行不同处理的接口,该接口是那些处理内容依赖于状态的方法集合,对应实例的state类
-
具体的状态实现了state接口,对应daystate和nightstate
-
contextcontext持有当前状态的具体状态的实例,此外,他还定义了供外部调用者使用的状态模式的接口。
作者:六尺帐篷
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
实际上在做金融二次加解密的时候,对于密钥替换,就可以用状态模式来做
简单状态模式与可切换状态的状态模式
- 简单状态模式:简单状态模式是指状态都相互独立,状态之间无须进行转换的状态模式,这是最简单的一种状态模式。对于这种状态模式,每个状态类都封装与状态相关的操作,而无须关心状态的切换,可以在客户端直接实例化状态类,然后将状态对象设置到环境类中。如果是这种简单的状态模式,它遵循“开闭原则”,在客户端可以针对抽象状态类进行编程,而将具体状态类写到配置文件中,同时增加新的状态类对原有系统也不造成任何影响。
- 可切换状态的状态模式:大多数的状态模式都是可以切换状态的状态模式,在实现状态切换时,在具体状态类内部需要调用环境类Context的setState()方法进行状态的转换操作,在具体状态类中可以调用到环境类的方法,因此状态类与环境类之间通常还存在关联关系或者依赖关系。通过在状态类中引用环境类的对象来回调环境类的setState()方法实现状态的切换。在这种可以切换状态的状态模式中,增加新的状态类可能需要修改其他某些状态类甚至环境类的源代码,否则系统无法切换到新增状态。