文档地址:《设计模式之禅》
切入故事: 城市的纵向发展功臣——电梯
定义: Allow an object to alter its behavior when its internal state changes.The object will appear to change its class.(当一个对象内在状态改变时允许其改变行为, 这个对象看起来像改变了其类。 )
通用类图:
● State——抽象状态角色
接口或抽象类, 负责对象状态定义, 并且封装环境角色以实现状态切换。
● ConcreteState——具体状态角色
每一个具体状态必须完成两个职责: 本状态的行为管理以及趋向状态处理, 通俗地说,就是本状态下要做的事情, 以及本状态如何过渡到其他状态。
● Context——环境角色
定义客户端需要的接口, 并且负责具体状态的切换。
环境角色有两个不成文的约束:
● 把状态对象声明为静态常量, 有几个状态对象就声明几个静态常量。
● 环境角色具有状态抽象角色定义的所有行为, 具体执行使用委托方式。
优点:
● 结构清晰
● 遵循设计原则
● 封装性非常好
缺点: 子类会太多, 也就是类膨胀。
使用场景:
● 行为随状态改变而改变的场景
● 条件、 分支判断语句的替代者
注意事项:
状态模式适用于当某个对象在它的状态发生改变时, 它的行为也随着发生比较大的变化, 也就是说在行为受状态约束的情况下可以使用状态模式, 而且使用时对象的状态最好不要超过5个。