`

设计模式与动态语言 之 状态模式(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
分享到:
评论

相关推荐

    《设计模式》实战---状态模式(State Pattern)

    8. **工具应用**:在实际开发中,状态模式常常与其他设计模式结合使用,如工厂模式用于创建状态对象,策略模式用于更灵活的状态行为选择。此外,一些现代编程语言提供了枚举类或类似功能,可以简化状态模式的实现。 ...

    C#面向对象设计模式纵横谈(22):(行为型模式) State 状态模式

    标题和描述均提到了"C#面向对象设计模式"中的State状态模式,这表明文章的核心内容是围绕State模式在C#编程语言中的应用展开。State模式是一种行为设计模式,旨在允许对象在其内部状态改变时,其行为也能相应地改变...

    24种设计模式以及混合设计模式

    通过学习和应用这些设计模式,开发者不仅可以提高代码的可读性、可维护性和可扩展性,还能提升团队间的沟通效率,因为设计模式是软件工程中的通用语言。对于任何有志于提升软件开发水平的人来说,理解和掌握设计模式...

    设计模式专题之(二十一)状态模式---设计模式状态模式示例代码(python--c++)

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。这种模式常用于处理对象的状态变化,使得对象的行为与其状态紧密相关,通过改变对象的状态,来改变对象的行为。 ...

    C语言设计模式 PDF《C Design Pattern》

    #### 一、C语言与设计模式 在计算机科学领域,设计模式是指在软件设计过程中解决常见问题的一套被广泛接受的解决方案。虽然设计模式最初是在面向对象编程语言中被广泛应用的,但也可以应用于像C这样的过程化语言。 ...

    java设计模式;java语言描述;经典的设计模式

    包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式...

    设计模式:Java语言中的应用.zip

    包括策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、备忘录模式(Memento)、状态模式(State)、访问者模式(Visitor)、责任链...

    软件设计模式与体系结构孙云山课后习题234章答案.zip

    - 状态模式(State):允许一个对象在其内部状态改变时改变它的行为。 - 策略模式(Strategy):定义一系列的算法,把它们一个个封装起来,并使它们可以相互替换。 - 模板方法模式(Template Method):在一个...

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

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

    23种面向对象设计模式

    文档中的“23种设计模式学习笔记.doc”可能包含了对这23种模式的详细解释和实例,而“设计模式之我爱我家.doc”可能从一个更生活化的角度来阐述设计模式的概念。“软件23种设计模式,超级经典的.pdf”可能是对这些...

    c#设计模式

    包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式...

    设计模式精解-GoF 23种设计模式解析附C++.pdf

    通过深入理解这些设计模式,我们可以更好地进行面向对象的分析与设计(OOA/D),提高代码的质量和系统的可维护性。 #### 0.1 设计模式解析(总序) 设计模式不仅仅是一系列具体的解决方案,更是一种思维方式。它们...

    设计模式23种类图

    - 状态模式(State):允许对象在其内部状态改变时改变其行为。 - 策略模式(Strategy):定义一系列算法,并将每一个算法封装起来,使它们可以互相替换。 - 模板方法模式(Template Method):定义一个操作中的...

    C#23种设计模式【完整】.pdf

    21. 状态模式(State Pattern):允许一个对象在其内部状态改变时改变其行为,使对象看起来似乎修改了其类。 通过学习和掌握这些设计模式,可以提高程序员的设计和编码能力,提高软件系统的灵活性、可维护性和可...

    C++设计模式代码资源18_State.zip

    "State"设计模式是其中的一种,它主要用于管理对象的状态以及状态之间的转换。C++作为一门强大的面向对象编程语言,非常适合实现这种模式。 State模式的核心思想是将一个对象的状态行为封装在独立的类中,这样可以...

    《设计模式》中文版

    - 状态模式(State):允许对象在其内部状态改变时改变它的行为,看起来就像对象改变了它的类。 - 策略模式(Strategy):定义一系列算法,并将每一个算法封装起来,使它们可以互相替换。 - 模板方法模式...

    设计模式C++版

    设计模式C++版文档主要聚焦于面向对象设计与分析的核心——设计模式,并以C++语言实现为示范。这份文档详尽阐述了23种GoF(Gang of Four)设计模式,并结合具体的C++源码示例,旨在帮助读者深入理解并掌握这些设计...

    C++设计模式.pdf

    从给定的文件信息来看,该文档主要涵盖了GoF(Gang of Four)提出的23种设计模式的详细解析,并附带了C++语言的实现源码。设计模式是在软件工程领域内,针对常见问题的一套经过验证的解决方案,它们为解决特定类型的...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 状态模式(State):允许对象在其内部状态改变时改变它的行为。 - 策略模式(Strategy):定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。 - 模板方法模式(Template Method):定义一个...

Global site tag (gtag.js) - Google Analytics