定 义:当一个对象内在状态改变时允许其改变行文,这个对象看起来像改变了其类
优 点:
1、结构清晰,避免了过多的switch case,if else
2、遵循设计原则,每个状态都是一个子类
3、封装性非常好
缺 点:子类会过多,也就是类膨胀
应用场景:
1、行为随状态改变而改变的场景
2、条件、分支判断语句的替代者
应用案例:
先来看看实际的状态模式UML图:
Status:抽象状态角色,接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态切换
ConcreteState:具体状态角色,每一个具体状态必须完成两个职责,本状态的行为管理以及趋向状态处理,通俗的说就是本状态下要做的事情以及本状态如何过渡到其他状态
Context:环境角色,环境角色有两个不成文的约束,1、把状态独享声明为静态常量,有几个状态对象就声明几个静态常量
2、环境角色具有状态抽象角色定义的所有行为,具体执行使用委托方式
举例子:日常常用的电梯,有很多状态,并且每个状态下都有不同的操作方法,那么我们可以用状态模式来进行设计