`
jefferent
  • 浏览: 80532 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

设计模式(11)——状态模式

 
阅读更多

1. 定义

    状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

    要点:

(1)策略模式和状态模式是双胞胎,它们有相同的类图,但是它们的意图不同。策略模式是围绕可以互换的算法来成功创建业务的,然而状态模式是通过改变对象内部的状态来帮助对象控制自己的行为.

(2)Context将与状态相关的操作委托给当前的Concrete State对象处理。

(3)Context可将自身作为一个参数传递给处理该请求的状态对象。这使得状态对象在必要时可访问Context。

(4)Context或Concrete State类都可决定哪个状态是另外哪一个的后继者,以及是在何种条件下进行状态转换。也就是说可以在State中保存对Concrete State的引用,在必要时设置具体的状态,做到状态的转换。

(5)一般来讲,当状态转换是固定的时候,状态转换就适合放在Context中。然而,当转换是更动态的时候,通常会放到具体的状态类中进行。(具体状态类持有Context的引用,实现状态的转换)

2. 类图及描述

图 状态模式类图

 

3. 应用场景及优缺点

    适用性:

(1)一个对象的行为取决于它的状态 , 并且它必须在运行时刻根据状态改变它的行为。

(2)一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常,有多个操作包含这一相同的条件结构。 State模式将每一个条件分支放入一独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。

 

    效果:

(1)State模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

State模式将所有与一个特定的状态相关的行为都放入一个对象中。因为所有与状态相关的代码都存在于某一个State子类中, 所以通过定义新的子类可以很容易的增加新的状态和转换。

另一个方法是使用数据值定义内部状态并且让Context操作来显式地检查这些数据。但这样将会使整个Context的实现中遍布看起来很相似的条件语句或case语句。增加一个新的状态可能需要改变若干个操作,这就使得维护变得复杂了。

State模式避免了这个问题,但可能会引入另一个问题,因为该模式将不同状态的行为分布在多个State子类中。这就增加了子类的数目,相对于单个类的实现来说不够紧凑。但是如果有许多状态时这样的分布实际上更好一些 , 否则需要使用巨大的条件语句。正如很长的过程一样,巨大的条件语句是不受欢迎的。它们形成一大整块并且使得代码不够清晰,这又使得它们难以修改和扩展。State模式提供了一个更好的方法来组织与特定状态相关的代码。决定状态转移的逻辑不在单块的 if或switch语句中, 而是分布在State子类之间。将每一个状态转换和动作封装到一个类中,就把着眼点从执行状态提高到整个对象的状态。这将使代码结构化并使其意图更加清晰。

(2)State对象可被共享。如果State对象没有实例变量,即它们表示的状态完全以它们的类型来编码,那么各Context对象可以共享一个 State对象。

 

 

分享到:
评论

相关推荐

    设计模式代码——c#

    C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...

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

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

    Java设计模式 版本2

    对象间的联动——观察者模式,处理对象的多种状态及其相互转换——状态模式,算法的封装与切换——策略模式,模板方法模式深度解析,操作复杂对象结构——访问者模式,设计模式与足球,多人联机射击游戏中的设计模式...

    python 状态模式(示例)

    设计模式——状态模式状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类应用场景:当控制一个对象的状态转换的条件表达式过于复杂时,把状态的判断逻辑转移到表示不同...

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    深入浅出设计模式(中文版)

    4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...

    深入浅出设计模式(中文版电子版)

    4.4.2现实中的装饰模式——相架 126 4.4.3C#实例——图书馆中的项目 127 4.4.4Java实例——自定义JButton 131 4.4.5优势和缺陷 133 4.4.6应用情景 134 4.5FacadePattern(外观模式) 134 4.5.1定义 134 4.5.2...

    Python设计模式之状态模式原理与用法详解

    设计模式——状态模式 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 应用场景:当控制一个对象的状态转换的条件表达式过于复杂时,把状态的判断逻辑转移

    java多线程设计模式详解(PDF及源码)

    本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计高手来说,这都是一本学习和认识JAVA...

    24种设计模式介绍与6大设计原则

    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 二、设计模式的六大原则 1、开闭原则(Open Close...

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

    1.2 Smalltalk MVC中的设计模式 1.3 描述设计模式 1.4 设计模式的编目 1.5 组织编目 1.6 设计模式怎样解决设计问题 1.7 怎样选择设计模式 1.8 怎样使用设计模式 第二章 实例研究:设计一个文档编辑器 2.1 设计问题...

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

    备忘录模式: 备忘录模式 备忘录模式 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。 的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以 在将来合适的时候把这个...

    java高手真经 (UML建模+设计模式+面向服务架构) 卷6

    行为图——状态图 uml/activity.mdl //06.行为图——活动图 uml/sequence.mdl //07.交互图——序列图 uml/collaboration.mdl //08.交互图——协作图 (2)UML上机演练源文件(16个实例文件) uml/usecase_product....

    C#设计模式(17)——观察者模式(Observer Pattern).pdf

    从生活中的例子可以看出,只要对订阅号... 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。

    design-pattern-java.pdf

    十一个行为型模式 状态模式-State Pattern 处理对象的多种状态及其相互转换——状态模式(一) 处理对象的多种状态及其相互转换——状态模式(二) 处理对象的多种状态及其相互转换——状态模式(三) 处理对象的...

    设计模式Demo

    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。 二、设计...

    面向对象状态模式

    面向对象系统分析设计——对象设计,状态模式

    设计模式——备忘录模式的学习与理解

    想要学习一个设计模式,首要的就是了解这个设计模式解决什么。 当我们没有学习备忘录模式的时候,我们想要去保存一个对象的状态,就会去新建一个对象。也就是说:一个对象对应一个保存对象状态的对象。当我们的对

    java高手真经 (UML建模+设计模式+面向服务架构) 卷8

    行为图——状态图 uml/activity.mdl //06.行为图——活动图 uml/sequence.mdl //07.交互图——序列图 uml/collaboration.mdl //08.交互图——协作图 (2)UML上机演练源文件(16个实例文件) uml/usecase_product....

    java高手真经 (UML建模+设计模式+面向服务架构) 卷3

    (3)设计模式样例(24个讲解样例程序) pattern/src/principle/liskovsubstitution//10.3.2里氏代换原则 pattern/src/creation/factorymethod //11.1工厂方法模式 pattern/src/creation/abstractfactory //11.2抽象...

Global site tag (gtag.js) - Google Analytics