C++ State 设计模式

C++ State 设计模式

 

 

 

 

 设计模式看的太快不利于消化,一方面是最近比较忙,另一方面是想让自己多消化消化自己所看的东西。所以本周只看了一个Sate设计模式

 

 

State模式的意图有2点:

1. 分散逻辑判断和处理。

对于State来说,无非就是状态的切换。说白了最终结果和switch/case差不多。对于少量的状态判断和逻辑处理,switch还行。但是对于一个较大的项目而且条件判断比较复杂,这个时候switch不仅效率低下,而且无法控制。State模式巧妙的将逻辑判断和处理放到状态对象中,而不是把条件判断和状态切换放在Context上下文中,从而分散了逻辑判断和处理。如果要更改逻辑,Context就不需要改动,只改动State类即可。

2. 去耦。我想这应该是Gof 设计模式的核心。

 

 

类图如下:

 

                           

 

State模式中,将条件判断和状态切换放在State的派生类中。这样降低了Context逻辑判断的复杂和依赖,降低了耦合度。

 

 

主要实现代码:

 

 

 //Context.h
#pragma once

class State;
class Context
{
friend class State;
public:
Context(void);
~Context(void);

public:
void OperationInterfaceA();
void OperationInterfaceB();
protected:
void ChangeState(State *pState);//状态切换
private:
State *__m_pState;//维护一个State基类指针
};

 

 

 

//Context.cpp
#include "Context.h"
#include "State.h"
#include "ConcreteStateA.h"

Context::Context(void)
{
__m_pState = ConcreteStateA::SInstance();
}
Context::~Context(void)
{
delete __m_pState;
__m_pState;
}
void Context::OperationInterfaceA()
{
__m_pState->OperationInterfaceA(this);
}
void Context::OperationInterfaceB()
{
__m_pState->OperationInterfaceB(this);
}
void Context::ChangeState(State *pState)
{
__m_pState = pState;
}

 

 

//State.h
#pragma once
class Context;
class State
{
public:
State(void);
virtual ~State(void);
public:
virtual void OperationInterfaceA(Context *pCxt){}
virtual void OperationInterfaceB(Context *pCxt){}
virtual void Handle();
virtual void ChangeState(State *pSt, Context *pCxt);
};

 

 

//State.cpp
#include "State.h"
#include "Context.h"
State::State(void)
{
}
State::~State(void)
{
}
void State::Handle()
{
}
void State::ChangeState(State *pSt, Context *pCxt)
{
pCxt->__m_pState = pSt;
}

 

 

//ConcreteStateA.h
#pragma once
#include "state.h"
class ConcreteStateA :
public State
{
public:
static ConcreteStateA *SInstance();
~ConcreteStateA(void);
public:
void Handle();
void OperationInterfaceA(Context *pCxt);

private:
ConcreteStateA(void);
static ConcreteStateA *__m_spInstance;
};

 

 

//ConcreteStateA.cpp

#include <iostream>
#include "ConcreteStateA.h"
#include "ConcreteStateB.h"
using namespace std;
ConcreteStateA* ConcreteStateA::__m_spInstance =NULL;
ConcreteStateA::ConcreteStateA(void)
{
}
ConcreteStateA::~ConcreteStateA(void)
{
if (__m_spInstance != NULL)
{
delete __m_spInstance;
__m_spInstance = NULL;
}
}
ConcreteStateA* ConcreteStateA::SInstance()
{
if (__m_spInstance == NULL)
{
__m_spInstance = new ConcreteStateA();
}
return __m_spInstance;
}
void ConcreteStateA::Handle()
{
cout << "Hi, I am in the StateA" << endl;
}
void ConcreteStateA::OperationInterfaceA(Context *pCxt)
{
Handle();
ChangeState(ConcreteStateB::SInstance(), pCxt);//状态切换逻辑处理
}

 

 

 

//ConcreteStateB.h

#pragma once
#include "state.h"
class ConcreteStateB :
public State
{
public:
static ConcreteStateB* SInstance();
~ConcreteStateB(void);
public:
void Handle();
void OperationInterfaceB(Context *pCxt);
private:
ConcreteStateB(void);
static ConcreteStateB *__m_sInstance;
};

 

 

//ConcreteStateB.cpp
#include <iostream>
#include "ConcreteStateB.h"
#include "ConcreteStateA.h"
using namespace std;
ConcreteStateB* ConcreteStateB::__m_sInstance = NULL;
ConcreteStateB::ConcreteStateB(void)
{
}
ConcreteStateB::~ConcreteStateB(void)
{
if (__m_sInstance != NULL)
{
delete __m_sInstance;
__m_sInstance = NULL;
}
}
ConcreteStateB* ConcreteStateB::SInstance()
{
if (__m_sInstance == NULL)
{
__m_sInstance = new ConcreteStateB();
}
return __m_sInstance;
}
void ConcreteStateB::Handle()
{
cout << "Hi, I am in the StateB" << endl;
}
void ConcreteStateB::OperationInterfaceB(Context *pCxt)
{
Handle();
State::ChangeState(ConcreteStateA::SInstance(), pCxt);
}

 

 

 

//main.cpp
#include <iostream>

#include "Context.h"
#include "ConcreteStateA.h"
#include "ConcreteStateB.h"
using namespace std;
int main(void)
{
Context txt;
txt.OperationInterfaceA();
txt.OperationInterfaceB();
txt.OperationInterfaceA();
}

 

 

输出如下:

 

Hi, I am in the StateA

Hi, I am in the StateB

Hi, I am in the StateA

 

 

 

 

 

 

 

时间: 2024-12-09 21:59:51

C++ State 设计模式的相关文章

在Java中应用State设计模式

对象的状态由各个属性的当前值构成.当我们调用某个对象的setXXX()方法时,通常表示修改它的XXX属性.另外,对象在执行方法时,也可能修改自己的状态.在某些情形下,例如建立事务或机器模型时,对象的状态可能是决定其行为的关键因素,依赖于状态的代码逻辑可能遍布于类的大量方法.State模式的目标就是简化这类代码,把依赖于状态的逻辑集中到一组类,每一个类代表一种不同的状态,避免if语句嵌套过深或过于复杂,转而依赖于多态性来调用不同的方法. 状态模型 如果对象的状态信息很关键,对象会拥有一些变量来指示

Design Patterns: Solidify Your C# Application Arch

Design Patterns: Solidify Your C# Application Architecture with Design Patterns中文版(下篇)    optimizer(翻译)   关键字     设计模式 singleton strategy decorator composite state   出处     http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnmag01/html

J2EE设计模式之State模式

设计模式,这个概念现在是满天飞,大家手里面估计都有,Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides, in the book "Design Patterns - Element of Re-Useable Object-Oriented Software",这本书.根据其中的说法,有三种,创建型模式.结构型模式和行为型模式.一共包括23个模式,在这里不一一列举.实际应用中,我们不可能在短时间内消化吸收掉,因为模

设计模式 ( 十七) 状态模式State(对象行为型)

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

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

每个人.事物在不同的状态下会有不同表现(动作),而一个状态又会在不同的表现下转移到下一个不同的状态(State).最简单的一个生活中的例子就是:地铁入口处,如果你放入正确的地铁票,门就会打开让你通过.在出口处也是验票,如果正确你就可以 ok,否则就不让你通过(如果你动作野蛮,或许会有报警(Alarm),:)). 有限状态自动机(FSM)也是一个典型的状态不同,对输入有不同的响应(状态转移). 通常我们在实现这类系统会使用到很多的 Switch/Case 语句,Case 某种状态,发生什么动作,C

设计模式:状态模式(State)

允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 状态模式的角色 1. 环境角色Context):也称上下文,定义客户端所感兴趣的接口,并且保留一个具体状态类的实例.这个具体状态类的实例给出此环境对象的现有状态. 2. 抽象状态角色(State):定义一个接口,用以封装环境对象的一个特定的状态所对应的行为. 3. 具体状态角色(ConcreteState):每一个具体状态类都实现了环境(Context)的一个状态所对应的行为. 案例 以酒店订房为例,房间的状态有:空闲.预

乐在其中设计模式(C#) - 状态模式(State Pattern)

原文:乐在其中设计模式(C#) - 状态模式(State Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它所属的类. 示例 有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里.在对象内部可以根据用户的不同选择不同的数据持久化方案. MessageModel using

实例讲解C++设计模式编程中State状态模式的运用场景_C 语言

State模式允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类. 在面向对象系统的开发和设计过程,经常会遇到一种情况就是需求变更(Requirement Changing),经常我们做好的一个设计.实现了一个系统原型,咱们的客户又会有了新的需求.我们又因此不得不去修改已有的设计,最常见就是解决方案就是给已经设计.实现好的类添加新的方法去实现客户新的需求,这样就陷入了设计变更的梦魇:不停地打补丁,其带来的后果就是设计根本就不可能封闭.编译永远都是整个系统代码. 访问者模式则提

【设计模式】—— 状态模式State

模式意图 允许一个对象在内部改变它的状态,并根据不同的状态有不同的操作行为. 例如,水在固体.液体.气体是三种状态,但是展现在我们面前的确实不同的感觉.通过改变水的状态,就可以更改它的展现方式. 应用场景 1 当一个对象的行为,取决于它的状态时 2 当类结构中存在大量的分支,并且每个分支内部的动作抽象相同,可以当做一种状态来执行时. 模式结构 Context 环境角色,里面包含状态对象 class Context{ private State state; public void setStat