浏览 1556 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-18
最后修改:2010-01-13
意图:允许一个对象在其内部状态改变时改变它的行为。这个对象看起来似乎修改了它的类。 动机: 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。 把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。 它所解决的问题:
结构: 适用性:
效果:
误用 好的状态模式必须做到两点(做不到即可以误用): 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 类图: 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |