设计模式之状态模式IFORNOIF(二十二)

今天大风大雨, 但心情还行, 继续撸DOTA

状态模式(state pattern)定义

[blockquote]

当一个对象的内在状态改变时允许改变其行为, 这个对象看起来像是改变了其类

[/blockquote]

这在我们开发的业务中太常见了, 角色权限的管理, 给予不同的权限, 不同角色的操作就会发生改变

设计模式之状态模式IFORNOIF(二十二)

该类图中包含三个角色

[blockquote]

  • Context: 包含状态的对象, 根据这些状态进行响应
  • State: 状态接口, 定义状态
  • ConreteState: 具体的状态, 并且实施对应状态的行为

[/blockquote]

状态模式解决的问题

[blockquote]

  • 当控制一个对象状态的条件表达式过于复杂时的情况. 把状态的判断逻辑转移到表示不同状态的一系列类中, 可以把复杂的判断逻辑简化
  • 提到状态 我们的代码中可能有各种 状态的判断使用的是if else 要是只是少量没必要使用状态模式, 但是要是很多呢, 那就使用状态模式吧
  • 使用多态代替了条件的判断, 这样我们代码的扩展性更加的强, 要加一些状态, 可以直接创建
  • 状态是可以被共享的, 在世纪的开发中我们会经常定义一些CommontStatus类, 表示的一些常量
  • 状态被管理者, 我们只需要关注一个固定的状态到其他状态的转换
  • 安全, 如上, 我们设置状态时, 必须是接口的实现类, 而不是一些整数, 这样可以杜绝魔数(莫名其妙的数字, 比如status == 1 哈哈)

[/blockquote]

总结: 状态模式适用某一个对象的行为取决于该对象的状态, 并且该对象的状态在运行时的转换, 又或者有很多的判断, 而这些判断只是因为某个不同而不断的切换(该判断下的对象的实现复杂的情况下)

相关推荐