论坛首页 编程语言技术论坛

设计模式与动态语言 之 状态模式(State)

浏览 1560 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-11-18   最后修改:2010-01-13
状态模式的别名是状态对象(Objects for States),它属于对象行为型模式,在开发中使用频率一般。


意图:允许一个对象在其内部状态改变时改变它的行为。这个对象看起来似乎修改了它的类。

动机:
   状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况。
   把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化。
   当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了。

它所解决的问题:
  • 晦涩(Opacity): 难以阅读,无法了解意图
  • 固执(Immobilicy): 难以分解,程序重用性差
  • 僵硬(Rigidity): 难以修改,每改一处,牵一发动全身
  • 脆弱(Fragility): 一旦修改,别的地方也炸到


结构:




适用性:
  •     一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为
  •     一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态


效果:
  • 特定状态相关的行为局部化, 不同的状态行为分割开来
  • 使用状态转化显式化
  • State 对象可以被共享


误用
  好的状态模式必须做到两点(做不到即可以误用):
    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



类图:



  • 大小: 7.3 KB
  • 大小: 40.1 KB
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics