以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码

//Context.h

#pragma once
class State;
class Context
{
public:
Context();
Context(State* st);
virtual ~Context();
void OperationInference();
void OperationChangeState();
protected:
private:
friend class State;
bool changeState(State* st);
State* _state;
};

//Context.cpp

#include"Context.h"
#include"State.h" Context::Context() {}
Context::Context(State* st)
{
this->_state = st;
}
Context::~Context()
{
delete _state;
}
void Context::OperationInference()
{
_state->OperationInference(this);
}
bool Context::changeState(State* state)
{
this->_state = state;
return true;
}
void Context::OperationChangeState()
{
_state->OperationChangemode(this);
}

//State.h

#pragma once
class Context;
class State
{
public:
State();
virtual ~State();
virtual void OperationInference(Context*) = ;
virtual void OperationChangemode(Context*) = ;
protected:
bool changeState(Context* con, State* st);
private:
}; class ConcreateStateA:public State
{
public:
ConcreateStateA();
virtual ~ConcreateStateA();
virtual void OperationInference(Context*);
virtual void OperationChangemode(Context*);
private:
protected:
}; class ConcreateStateB :public State
{
public:
ConcreateStateB();
virtual ~ConcreateStateB();
virtual void OperationInference(Context*);
virtual void OperationChangemode(Context*);
private:
protected:
};

//State.cpp

#include"State.h"
#include"context.h"
#include<iostream>
State::State(){}
State::~State(){}
void State::OperationInference(Context* con)
{
std::cout << "State::..." << std::endl;
}
bool State::changeState(Context* con, State* st)
{
con->changeState(st);
return true;
}
void State::OperationChangemode(Context* con)
{ }
ConcreateStateA::ConcreateStateA()
{ }
ConcreateStateA::~ConcreateStateA()
{}
void ConcreateStateA::OperationInference(Context* con)
{
std::cout << "OperationInference ConcreateStateA" << std::endl;
}
void ConcreateStateA::OperationChangemode(Context* con)
{
OperationInference(con);
this->changeState(con, new ConcreateStateB());
}
ConcreateStateB::ConcreateStateB(){}
ConcreateStateB::~ConcreateStateB(){}
void ConcreateStateB::OperationInference(Context* con)
{
std::cout << "OperationInference ConcreateStateB" << std::endl;
}
void ConcreateStateB::OperationChangemode(Context* con)
{
OperationInference(con);
this->changeState(con, new ConcreateStateA());
}

//main.cpp

#include"Context.h"
#include"State.h"
#include<iostream>
int main(int args, char* argv)
{
State* st = new ConcreateStateA();
Context* con = new Context(st);
con->OperationChangeState();
con->OperationChangeState();
con->OperationChangeState();
if (!con)
delete con;
if (NULL != st)
st = NULL;
return ; }

设计模式-State(行为模式)-很好的实现了对象的状态逻辑与动作实现的分类,状态逻辑在State的派生类实现,动作可以放在Context类中实现。的更多相关文章

  1. C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi

    C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...

  2. 游戏开发设计模式之原型模式 & unity3d JSON的使用(unity3d 示例实现)

    命令模式:游戏开发设计模式之命令模式(unity3d 示例实现) 对象池模式:游戏开发设计模式之对象池模式(unity3d 示例实现) 实现原型模式 原型模式带来的好处就是,想要构建生成任意独特对象的 ...

  3. 设计模式之组合模式(Composite Pattern)

    一.什么是组合模式? 组合模式提供了一种层级结构,并允许我们忽略对象与对象集合之间的差别 调用者并不知道手里的东西是一个对象还是一组对象,不过没关系,在组合模式中,调用者本来就不需要知道这些 二.举个 ...

  4. 转:.net设计模式之工厂模式

    原文:http://terrylee.cnblogs.com/archive/2006/01/04/310716.html 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对 ...

  5. python设计模式之解释器模式

    python设计模式之解释器模式 对每个应用来说,至少有以下两种不同的用户分类. [ ] 基本用户:这类用户只希望能够凭直觉使用应用.他们不喜欢花太多时间配置或学习应用的内部.对他们来说,基本的用法就 ...

  6. Java设计模式—中介者模式

    中介者模式是一种并不常用的模式,在此简单阐述阐述. 定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 类型:行为类模式 ...

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

    设计模式:状态(State)模式 一.前言     状态模式在某些场合中使用是非常方便的,什么叫做状态,如果大家学过<编译原理>就会明白DFA M和NFA M,在确定有限状态机和非确定有限 ...

  8. 设计模式之策略模式和状态模式(strategy pattern & state pattern)

    本文来讲解一下两个结构比较相似的行为设计模式:策略模式和状态模式.两者单独的理解和学习都是比较直观简单的,但是实际使用的时候却并不好实践,算是易学难用的设计模式吧.这也是把两者放在一起介绍的原因,经过 ...

  9. C#设计模式(19)——状态者模式(State Pattern)

    一.引言 在上一篇文章介绍到可以使用状态者模式和观察者模式来解决中介者模式存在的问题,在本文中将首先通过一个银行账户的例子来解释状态者模式,通过这个例子使大家可以对状态者模式有一个清楚的认识,接着,再 ...

随机推荐

  1. django nginx 504 time-out 错误

    报错: 分析 nginx和uwsgi整合时有三个参数可以用于设置超时时间: 1.uwsgi_connect_timeout: 默认60秒,与uwsgi-server连接的超时时间,该值不能超过75秒. ...

  2. Dynamics 365客户端编程示例:两个选项集字段的联动

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  3. Java学习笔记 -- 头代码

    每次写Java程序都会忘记这个main代码怎么写,特意把他写下来,之后忘了还可以温故而知新. 程序猿们请千万不要鄙视我o(╯□╰)o public static void main(String[] ...

  4. java 后端与前端Date类型与String类型互相转换(使用注解)

    后端返回的类型中,直接定义Date类型,加上此注解,直接将Date类型转成自定义的格式给前端 class TestDateOutput{ @JsonFormat(pattern = "yyy ...

  5. 关于String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

    关于 String path = request.getContextPath(); String basePath = request.getScheme()+"://"+req ...

  6. C++继承产生的问题

    今天写代码,用到了继承,忘了将父类中的私有成员改为protected,结果一调用父类地函数后,子类中的root指针直接变为了父类中的空的root.私有成员在继承后依然会保留,占一定的内存空间,但却没有 ...

  7. 批量装机工具cobbler简介及其安装使用

    前言:如果仅有几台机器的话,使用U盘或者光盘装起来还不是很费事,一旦数量到了一定程度,使用手动方法就是一件费时费力的事,PXE+kistart就可以解决这个问题,降低难度,加快速度,而cobbler更 ...

  8. 函数式接口 & lambda表达式 & 方法引用

    拉呱: 终于,学习jdk8的新特性了,初体验带给我的感觉真爽,代码精简的不行,可读性也很好,而且,spring5也是把jdk8的融入到血液里,总之一句话吧,说的打趣一点,学的时候自己难受,学完了写出来 ...

  9. maven打成jar包后,其他工程导入不进去

    关键点 classifier中配置exec pom文件配置 <plugin> <groupId>org.springframework.boot</groupId> ...

  10. Python Web(一)

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.Web框架 1.socket网络编程 架构:C/S 协议:TCP/UDP 传输层 2.Web应用 架构:B/S ...