跳转到内容

状态模式

维基百科,自由的百科全书

状态模式是一种行为类型软件设计模式,它可以让物件在其内部状态有变化时,改为其行为。这种模式有点像有限状态机的概念。状态模式可以被当成成一种策略模式,它能够在调用模式界面中所定义的方法来切换策略。

计算机编程中,状态模式用于,当同一物件基于其内部状态而有不同行为,将其行为进行封装。对于物件来说,这可以是一种更为简洁方式,可以在运行时更改其行为而无需诉诸条件语句,从而提高可维护性。 [1] :395

概述[编辑]

状态设计模式的示例 UML 类别图和序列图。 [2]

状态设计模式是《设计模式:可复用面向对象软件的基础》所收录的二十三个之一,本书描述了如何解决常见的设计问题。此类问题涵盖了灵活且可重用的面向对象软件的设计,例如易于实现、更改、测试和重用的对象。 [3]

状态模式常用来解决两个主要问题: [4]

  • 当对象的内部状态改变时,它的行为也应该改变。
  • 应独立定义特定于国家的行为。也就是说,添加新状态不应影响现有状态的行为。

在类别中直接为特定状态实作行为是不够弹性的,因为它将类别与特定行为绑定,这将使得如果要增加新的状态或改变状态的行为,而且这些行为是与类别独立的,仍无法在不更改类别的情况下达到。因此,此模式描述了两种解决方案:

  • 定义单独的(状态)物件,封装每个装态的特定的行为。即,定义一个界面(状态)以用于执行与状态有关的特定行为,并为每种状态实现该接口的类别。
  • 类别不要直接实现与状态有关的特定行为,而是将其委由当前戕态物件。

这使得类别与业于状态的行为的实作可以独立开来。新的状态可以通过定义新的状态类别来实现。类别可以在运行时,借由改变当前状态物件来改变其行为。

结构[编辑]

UML 中的状态[1]

在随附的统一建模语言(UML)类别图中, Context 类别不直接实现特定于状态的行为。相反, ContextState 界面以执行特定于状态的行为 ( state.handle() ),这使得 Context 独立于特定于状态行为的实现方式。 ConcreteStateAConcreteStateB 类别实现 State 界面,即实现(封装)每个状态的特定行为。 UML序列图 说明了运行时互动:

Context对象将特定于状态的行为委托给不同的State对象。首先, Context 调用handle(this) 时,会是基于其当前(初始)状态 ( ConcreteStateA ) 的行为,其会执行操作并调用 Context.setState(ConcreteStateB) 来将当前状态更改为ConcreteStateB 。下一次, Context 再次调用 handle(this) 会是基于其当前状态对象 ( ConcreteStateB ) ,其会执行操作,并将当前状态更改为 ConcreteStateA

参考[编辑]

  1. ^ 1.0 1.1 Erich Gamma; Richard Helm; Ralph Johnson; John M. Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley. 1995. ISBN 0-201-63361-2.  引用错误:带有name属性“GOF”的<ref>标签用不同内容定义了多次
  2. ^ The State design pattern – Structure and Collaboration. w3sDesign.com. [2017-08-12]. 
  3. ^ Erich Gamma; Richard Helm; Ralph Johnson; John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software需要免费注册. Addison Wesley. 1994: 305ff. ISBN 0-201-63361-2. 
  4. ^ The State design pattern - Problem, Solution, and Applicability. w3sDesign.com. [2017-08-12]. (原始内容存档于2023-11-17).