状态模式的别名是状态对象(Objects for States),它属于对象行为型模式,在开发中使用频率一般。
[b]意图:允许一个对象在其内部状态改变时改变它的行为。这个对象看起来似乎修改了它的类。[/b]
动机:
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。
把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
它所解决的问题:
[list]
[*]晦涩(Opacity): 难以阅读,无法了解意图
[*]固执(Immobilicy): 难以分解,程序重用性差
[*]僵硬(Rigidity): 难以修改,每改一处,牵一发动全身
[*]脆弱(Fragility): 一旦修改,别的地方也炸到
[/list]
结构:
[img]http://dl.iteye.com/upload/attachment/169698/8fb77d94-69ee-31e9-8a32-6c6191b64d84.png[/img]
适用性:
[list]
[*] 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为
[*] 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态
[/list]
效果:
[list]
[*]特定状态相关的行为局部化, 不同的状态行为分割开来
[*]使用状态转化显式化
[*]State 对象可以被共享
[/list]
误用
好的状态模式必须做到两点(做不到即可以误用):
1. 状态变化必须从外界其它逻辑划分出来。
2. 状态必须可方便拓展,对其它代码影响非常小。
下面是一个小例子:
类图:
[img]http://dl.iteye.com/upload/attachment/169788/10bc683d-e024-3434-a309-fc9ca8174a40.jpg[/img]
[b]意图:允许一个对象在其内部状态改变时改变它的行为。这个对象看起来似乎修改了它的类。[/b]
动机:
状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。
把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。
它所解决的问题:
[list]
[*]晦涩(Opacity): 难以阅读,无法了解意图
[*]固执(Immobilicy): 难以分解,程序重用性差
[*]僵硬(Rigidity): 难以修改,每改一处,牵一发动全身
[*]脆弱(Fragility): 一旦修改,别的地方也炸到
[/list]
结构:
[img]http://dl.iteye.com/upload/attachment/169698/8fb77d94-69ee-31e9-8a32-6c6191b64d84.png[/img]
适用性:
[list]
[*] 一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为
[*] 一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态
[/list]
效果:
[list]
[*]特定状态相关的行为局部化, 不同的状态行为分割开来
[*]使用状态转化显式化
[*]State 对象可以被共享
[/list]
误用
好的状态模式必须做到两点(做不到即可以误用):
1. 状态变化必须从外界其它逻辑划分出来。
2. 状态必须可方便拓展,对其它代码影响非常小。
下面是一个小例子:
class State
attr_accessor :name
def get_speed
end
def get_skills
end
def down_blood
end
end
class PoisonedState < State
def initialize
@name = '目前是中毒状态'
end
def get_speed
puts '速度减慢10%'
end
def get_skills
puts '技能正常'
end
def down_blood
puts '每秒减血10点'
end
end
class FrostState < State
def initialize
@name = '目前是冰冻状态'
end
def get_speed
puts '速度减慢100%'
end
def get_skills
puts '所有技能无效'
end
def down_blood
puts '不减血'
end
end
class SheepState < State
def initialize
@name = '目前是变羊状态'
end
def get_speed
puts '速度减慢50%'
end
def get_skills
puts '所有技能无效'
end
def down_blood
puts '不减血'
end
end
class NormalState < State
def initialize
@name = '目前是正常状态'
end
def get_speed
puts '速度正常'
end
def get_skills
puts '所有技能正常'
end
def down_blood
puts '不减血'
end
end
class Hero
attr_accessor :state
def initialize
@state = NormalState.new
end
def get_speed
state.get_speed
end
def get_skills
state.get_skills
end
def down_blood
state.down_blood
end
end
[NormalState.new, PoisonedState.new, FrostState.new, SheepState.new].each do |s|
h = Hero.new
h.state = s
puts "\r\n"
puts h.state.name
h.get_speed
h.get_skills
h.down_blood
end
类图:
[img]http://dl.iteye.com/upload/attachment/169788/10bc683d-e024-3434-a309-fc9ca8174a40.jpg[/img]