解释:
当一个对象的内在状态时允许改变其行为,这个对象看起来是改变了一个类。
针对问题:
对象状态的判断逻辑过于复杂,有很多的分支判断,形成long method。
使用条件:
1.当一个对象的行为取决于它的状态,且它必须在运行时刻根据状态改变它的行为,可以考虑状态模式。
2.某项业务有多个状态,状态通常都是一些枚举变量,状态的白话都是依靠大量的多分支判断语句来实现的。
原理:
控制一个对象状态转换的条件表达式过于复杂时,把状态的判断逻辑转义到表示不同状态的一系列类当中,从而把复杂的判断逻辑简化。
结构图:
客户端
优点:
将于特定状态相关的行为局部化,并将不同状态的行为分割开来。修改状态容易。
将特定状态相关的行为都放入一个对象中,由于所有与状态相关的代码都中存在与一个ConcreteState中,定义新的子类可以很容易地增加新的状态和转换。添加状态容易。
目的:消除庞大的条件分支语句,易于修改、扩展。大的分支判断会使得难以修改、扩展。状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖。(例,活字印刷)
示例:
客户端:
对比未使用状态模式的代码:
客户端:
扩展:
面向对象设计:就是希望做到代码的责任分解。
long method:
代码坏味道之一。如果方法过长其实极有可能是有坏问道了。
如果方法很长,且有很多的分支判断,则意味着它的责任过大了。无论是任何状态都需要通过它来改变,是很糟糕的。违背了“单一职责原则”。
需求改动、增加时,需要对方法做改动,维护出错风险大。违背了“开放-封闭原则”。