[C++设计模式] state 状态模式

《head first 设计模式》中的例子很不错,想制造一个自动交易的糖果机,糖果机有四个状态:投入钱不足,投入钱足够,出售糖果,糖果售罄。糖果机的当前状态处于其中不同的状态时,它针对同一个操作的反映动作也不同。传统面向过程编程会套用if-else对不同的状态下分别处理,逻辑麻烦而且不具有可拓展性。

状态模式:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。状态模式的重点在于状态转换,很多时候,对于一个对象的状态,我们都是让这个对象包含一个状态的属性,这个状态属性记录着对象的具体状态,根据状态的不同使用分支结构来执行不同的功能,就像上面的代码那样处理;就像上面说的,类中存在大量的结构类似的分支语句,变得难以维护和理解。状态模式消除了分支语句,就像工厂模式消除了简单工厂模式的分支语句一样,将状态处理分散到各个状态子类中去,每个子类集中处理一种状态,这样就使得状态的处理和转换清晰明确

State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为。

ConcreteState类,具体状态,每一个子类实现一个与Context的一个状态相关的行为。

Context类,维护一个ConcreteState子类的实例,这个实例定义当前的状态。

给出框架,不再实现,比较好理解。

class Context;
class State
{
public:
    virtual void Handle(Context* pContext)=0;
    ~State();
protected:
    State();
private:
};

class ConcreteStateA : public State
{
public:
    ConcreteStateA();
    ~ConcreteStateA();
    virtual void Handle(Context* pContext);
protected:
private:
};

class ConcreteStateB : public State
{
public:
    ConcreteStateB();
    ~ConcreteStateB();
    virtual void Handle(Context* pContext);
protected:
private:
};

class ConcreteStateC : public State
{
public:
    ConcreteStateC();
    ~ConcreteStateC();
    virtual void Handle(Context* pContext);
protected:
private:
};

class Context
{
public:
    Context(State* pState);
    ~Context();
    void Request();
    void ChangeState(State* pState);
protected:
private:
    State* _state;
};

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 21:07:51

[C++设计模式] state 状态模式的相关文章

程序设计模式 —— State 状态模式

我应该如何阅读? 本文将使用优雅的文字风格来告诉你什么是状态模式. 注意: 1.在阅读本文之前请保证你已经掌控了 面对对象的思想与 多态的基本概念,否则将难以理解. 2.本文实现将用C++实现,你不一定必须学会C++,这些代码都有非常丰富的注释和简单的语法. 3.请不要跳着看,除非你已经学会. 那么现在开始吧 或许你会以为是类的各种状态,其实差不多.但是还有各种行为 允许一个对象在其内部状态改变时改变它的行为.实例化的对象看起来似乎修改了它的类 首先,状态,顾名思义你应该就差不多明白.它可以表示

JAVA设计模式之 状态模式【State Pattern】

一.概述 当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式.状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化.状态模式是一种对象行为型模式. 二.适用场景 用于解决系统中复杂对象的多种状态转换以及不同状态下行为的封装问题.简单说就是处理对象的多种状态及其相互转换. 三.UML类图 四.参与者 1>.AbstractState(抽象状态类): 在抽象状态类中定义申明了不同状态下的行为抽象方法,而由子类

设计模式21:State 状态模式(行为型模式)

State 状态模式(行为型模式) 动机(Motivation) 在软件构建过程中,某些对象的状态如果改变,其行为也会随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态的行为就可能完全不同. 如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转换之间引入紧耦合? 意图(Intent) 允许一个对象在其内部状态改变时改变它的行为.从而使对象看起来似乎修改了其行为.——<设计模式>GoF 结构(Structure) 示例代码 public enum Document

设计模式 ( 十八 ):State状态模式 -- 行为型

1.概述 在软件开发过程中,应用程序可能会根据不同的情况作出不同的处理.最直接的解决方案是将这些所有可能发生的情况全都考虑到.然后使用if... ellse语句来做状态判断来进行不同情况的处理.但是对复杂状态的判断就显得“力不从心了”.随着增加新的状态或者修改一个状体(if else(或switch case)语句的增多或者修改)可能会引起很大的修改,而程序的可读性,扩展性也会变得很弱.维护也会很麻烦.那么我就考虑只修改自身状态的模式. 例子1:按钮来控制一个电梯的状态,一个电梯开们,关门,停,

详解state状态模式及在C++设计模式编程中的使用实例

原文地址:http://www.jb51.net/article/80713.htm 这篇文章主要介绍了state状态模式及在C++设计模式编程中的使用实例,在设计模式中策略用来处理算法变化,而状态则是透明地处理状态变化,需要的朋友可以参考下 每个人.事物在不同的状态下会有不同表现(动作),而一个状态又会在不同的表现下转移到下一个不同的状态(State).最简单的一个生活中的例子就是:地铁入口处,如果你放入正确的地铁票,门就会打开让你通过.在出口处也是验票,如果正确你就可以 ok,否则就不让你通

设计模式之状态模式(State)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

设计模式---状态变化模式之state状态模式(State)

前提:状态变化模式 在组建构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一个问题提供了一种解决方案. 典型模式 状态模式:State 备忘录模式:Memento 一:State状态模式 (一)概念 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. (二)动机 在软

软考总结— 设计模式之状态模式

软考在即,针对下午题的设计模式,本人有觉得有必要从考试战略上稍微做一些总结.为什么呢?一方面设计模式只要掌握好做题技巧,还是比较好拿分的.另一方面,通过这次软考又进一步的学习设计模式,而且在题目中给出的设计模式都是在项目中很好的应用. 一开始做题,没有全局观.俗话说的好"不谋全局者不足谋一域",不管做什么事,先在战略方向上把握好了,采取什么样的战术,都不成什么问题了.所以考试也是一样.下面这道题就很典型:   [题目] 某大型商场内安装了多个简易的纸巾售卖机,自动出售2元钱一包的纸巾,

设计模式之状态模式

<设计模式>对状态模式的定义:允许一个对象在其状态改变时,改变它的行为.看起来对象似乎修改了它的类.别名:状态对象(Objects for State). 在下面两种情况下均可以使用State模式: 1 一个对象的行为取决于它的状态,并且他必须在运行时刻根据状态改变它的行为. 2 一个操作中含有庞大的多分枝的条件语句,并且这些分支依赖于该对象的状态.这个状态通常用一个或多个枚举常量表示.通常,有多个操作包含这一相同的条件结构.State模式将每一个条件分支放入一个独立的类中.这是得你可以根据对