State状态机模式

#include <iostream>
using namespace std;

class Contex;
//即使此处声明了,如果类中调用的有Contex函数,
//那么编译器也会找不到定义的地方,所有这里我将
//所有的类的实现都延迟在外面,这样对于每一个类而言,
//其他的类都是可见的,最大的好处就是类之间的相互调用
//不会产生什么未定义类型的错误警告。
class Base
{
public:

    virtual void change(Contex *cn) = 0;
    virtual void PrintfBase() = 0;
};
class Son1 : public Base
{
public:

    void change(Contex *cn);
    void PrintfBase();
};
class Son2 : public Base
{
public:
    void change(Contex *cn);

    void PrintfBase();
};
class Son3 : public Base
{
public:
    void change(Contex *cn);

    void PrintfBase();
};

class Contex
{
public:
    Contex(Base *b);
    void Printf();
    void changestate(Base *b);
    void Do();
private:
    Base *_b;
};
void Son1::change(Contex *cn)
{
    cn->changestate(new Son2());
}
void Son1::PrintfBase()
{
    cout << "Son1::PrintfBase()" << endl;
}

void Son2::change(Contex *cn)
{
    cn->changestate(new Son3());
}
void Son2::PrintfBase()
{
    cout << "Son2::PrintfBase()" << endl;
}

void Son3::PrintfBase()
{
    cout << "Son3::PrintfBase()" << endl;
}
void Son3::change(Contex *cn)
{
    cn->changestate(new Son1());
}

Contex::Contex(Base *b)
{
    _b = b;
}
void Contex::Printf()//这里就是相应的状态应该做的事情。
{
    _b->PrintfBase();
}
void Contex :: changestate(Base *b)
{
    _b = b;
}
void Contex::Do()
{
    //调整状态,具体的状态调整在子类中完成,最终的转换则是在
    //当前类中完成。
    _b->change(this);
}
int main()
{
    Base *b = new Son1();
    Contex *p = new Contex(b);
    int n = 10;
    while (n--)
    {
        p->Printf();
        p->Do();//调用此函数切换状态。
    }
    return 0;
}

//状态机无非就是状态的切换封装在类当中了。

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

时间: 2024-10-06 14:42:15

State状态机模式的相关文章

状态机模式

现在需要你做一个简单是视频播放器的APP,主要有播放,暂停,停止三个功能,在没学状态机模式之前,你可能会这样来实现: 现抽象个IPlayer接口,定义好你的播放器需要实现的动作和可能的状态字段: 01.1 public interface IPlayer { 02.2     public static final int STATE_PLAYING = 1; 03.3     public static final int STATE_PAUSED = 2; 04.4     public s

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

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

游戏设计模式——状态机模式

前言:状态机模式是一个游戏常用的经典设计模式,常被用作处理一个生物的各种状态(例如行走,站立,跳跃等). 假如我们正在开发一款动作游戏,当前的任务是实现根据输入来控制主角的行为--当按下B键时,他应该跳跃. 直观的代码: if (input == PRESS_B) { if (!m_isJumping) { m_isJumping = true; Jump();//跳跃的代码 } } 后来我们需要添加更多行为了,所有行为如下: 站立时按下 ↓ 键 => 蹲下. 蹲下时按下 ↓ 键 => 站立.

State状态模式(C++实现)

状态模式:状态模式的意图是,允许一个对象在其内部状态改变时,改变它的行为.看起来就像是改变了它的类一样. 主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同的一系列类当中,可以把复杂的逻辑判断简单化. 类图如下图所示 State类,抽象状态类,定义一个接口以封装与Context的一个特定状态相关的行为.ConcreteState类,具体状态,每一个子类实现一个与Context的一个状态相关的行为.Context类,维护一个ConcreteState子类

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

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

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

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

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

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

设计模式(20)--State(状态模式)--行为型

作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样. 2.模式特点: 状态模式的主要优点在于封装了转换规则,并枚举可能的状态,它将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为,还可以

State 状态模式

简介 状态模式允许一个对象在其内部[状态]改变的时候改变其[行为].这个对象看上去就像是改变了它的类一样. 用一句话来表述,状态模式把所研究的对象的[行为]包装在不同的[状态对象]里,[每一个状态对象]都属于[一个抽象状态类的一个子类].状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变. 状态模式将每[一个条件分支]放入[一个独立的类]中. 这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化. 角色 环境类Context:定义客户感兴