`

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

阅读更多
状态模式的别名是状态对象(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
分享到:
评论

相关推荐

    GOLF设计模式(C++语言版)

    5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的...

    设计模式可复用面向对象软件的基础.zip

    书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...

    设计模式 GOF 23

    设计模式捕获了随时间进化与发展的问题的求解方法,因此它们并不是人们从一开始就采用的设计方案。它们反映了不为人知的重新设计和重新编码的成果,而这些都来自软件开发者为了设计出灵活可复用的软件而长时间进行的...

    设计模式--C++

    5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型模式 208 5.10 TEMPLATE METHOD(模板方法)—类行为型模式 214 5.11 VISITOR(访问者)—对象行为型模式 218 5.12 行为模式的讨论 228 ...

    设计模式:可复用面向对象软件的基础--详细书签版

    设计模式捕获了随时间进化与发展的问题的求解方法,因此它们并不是人们从一开始就采用的设计方案。它们反映了不为人知的重新设计和重新编码的成果,而这些都来自软件开发者为了设计出灵活可复用的软件而长时间进行的...

    《设计模式》中文版(23个设计模式的介绍与运用)

    5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 ...

    设计模式(.PDF)

    5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 ...

    《国外写的,翻译版本》设计模式

    最出名的设计模式,语言诙谐明了。 目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决...

    C#23种设计模式_示例源代码及PDF

    1、 FACTORY —追 MM 少不了请吃饭了, 麦当劳的鸡翅和肯德基的鸡翅都是 MM...20、STATE —跟 MM 交往时,一定要注意她的状态哦,在不同的状态时她的行为会有不同, 、 比如你约她今天晚上去看电影,对你没兴趣的 MM 就...

    Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides23种设计模式

    5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 ...

    设计模式文档

    5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 ...

    [源代码] 《易学 设计模式》 随书源代码

    第18章 变化多端:状态模式 (State) 第19章 明修栈道,暗度陈仓:策略模式 (Strategy) 第20章 循序渐进:职责链模式 (ChainofResponsibility) 第21章 独具匠心:命令模式 (Command) 第22章 步调一致:访问者模式 ...

    GoF 的 23 种设计模式

    GoF 的 23 种设计模式的分类,现在对各个模式的功能进行介绍。 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。 原型(Prototype)模式:将一...

    设计模式 design pattern

    5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 ...

    软件设计师必读的书-设计模式

    5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 ...

    JAVA经典设计模式大全

    5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的...

    设计模式part1

    目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计...

    设计模式___

    5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—对象行为型 模式 218 5.12 行为模式的讨论 228 ...

    设计模式part2

    目 录 序言 前言 读者指南 第1章 引言 1 1.1 什么是设计模式 2 1.2 Smalltalk MVC中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计...

    Head.First设计模式_PDF.part1

    第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、Abstract Factory、Factory Method、Singleton、Command、Adapter、Facade、Templat Method、Iterator、Composite、State、Proxy。最后三章比较...

Global site tag (gtag.js) - Google Analytics