设计模式-State(行为模式)-很好的实现了对象的状态逻辑与动作实现的分类,状态逻辑在State的派生类实现,动作可以放在Context类中实现。
以下代码来源: 设计模式精解-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类中实现。的更多相关文章
- C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi
C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...
- 游戏开发设计模式之原型模式 & unity3d JSON的使用(unity3d 示例实现)
命令模式:游戏开发设计模式之命令模式(unity3d 示例实现) 对象池模式:游戏开发设计模式之对象池模式(unity3d 示例实现) 实现原型模式 原型模式带来的好处就是,想要构建生成任意独特对象的 ...
- 设计模式之组合模式(Composite Pattern)
一.什么是组合模式? 组合模式提供了一种层级结构,并允许我们忽略对象与对象集合之间的差别 调用者并不知道手里的东西是一个对象还是一组对象,不过没关系,在组合模式中,调用者本来就不需要知道这些 二.举个 ...
- 转:.net设计模式之工厂模式
原文:http://terrylee.cnblogs.com/archive/2006/01/04/310716.html 概述 在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对 ...
- python设计模式之解释器模式
python设计模式之解释器模式 对每个应用来说,至少有以下两种不同的用户分类. [ ] 基本用户:这类用户只希望能够凭直觉使用应用.他们不喜欢花太多时间配置或学习应用的内部.对他们来说,基本的用法就 ...
- Java设计模式—中介者模式
中介者模式是一种并不常用的模式,在此简单阐述阐述. 定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 类型:行为类模式 ...
- 设计模式:状态(State)模式
设计模式:状态(State)模式 一.前言 状态模式在某些场合中使用是非常方便的,什么叫做状态,如果大家学过<编译原理>就会明白DFA M和NFA M,在确定有限状态机和非确定有限 ...
- 设计模式之策略模式和状态模式(strategy pattern & state pattern)
本文来讲解一下两个结构比较相似的行为设计模式:策略模式和状态模式.两者单独的理解和学习都是比较直观简单的,但是实际使用的时候却并不好实践,算是易学难用的设计模式吧.这也是把两者放在一起介绍的原因,经过 ...
- C#设计模式(19)——状态者模式(State Pattern)
一.引言 在上一篇文章介绍到可以使用状态者模式和观察者模式来解决中介者模式存在的问题,在本文中将首先通过一个银行账户的例子来解释状态者模式,通过这个例子使大家可以对状态者模式有一个清楚的认识,接着,再 ...
随机推荐
- Effect:Mobile ocd
Satisfy the following two Keep your phone at all times Check your phone even if there's no news Alwa ...
- Eclipse如何重置窗口
https://jingyan.baidu.com/article/915fc41459585f51394b20c3.html 在Eclipse进行开发的时候,我们经常会由于这个窗口或者那个窗口没有打 ...
- Chrome 开发者工具实用操作
Chrome 开发者工具实用操作 https://umaar.com/dev-tips/
- java程序猿工具
1.做为一个程序员打字最重要 指法打字练习软件:http://home.bdqn.cn/thread-11142-1-1.html 2.JDK必不可少 JDK6.X下载 JDK ...
- 【tf.keras】tensorflow datasets,tfds
一些最常用的数据集如 MNIST.Fashion MNIST.cifar10/100 在 tf.keras.datasets 中就能找到,但对于其它也常用的数据集如 SVHN.Caltech101,t ...
- win10+Ubuntu16.04双系统下深度学习环境的搭建
环境零零碎碎地搭了三四天,虽然碰到各种问题,但还是搭建好了,自己整理记录下,同时也算给有需要的人一些指导吧 一.双系统的安装 Win10硬盘管理助手 压缩或者直接利用未使用的空间,空间大小自定,将腾出 ...
- 14. java面向对象 - 基础
一.面向对象主线 1. Java类及类的成员:属性.方法.构造器.代码块.内部类 2. 面向对象三大特征:封装.继承.多态.(抽象性) 3. 其他关键字:this.super.static.final ...
- combination sum && combination sum II
1.Given a set of candidate numbers (candidates) (without duplicates) and a target number (target), f ...
- acwing 851. spfa求最短路 模板
地址 https://www.acwing.com/problem/content/description/853/ 给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你求出 ...
- 【Spring JDBC】NamedParameterJdbcTemplate(四)
一.什么是具名参数 在经典的 JDBC 用法中, SQL 参数是用占位符 ? 表示,并且受到位置的限制.定位参数的问题在于, 一旦参数的顺序发生变化, 就必须改变参数绑定.在 Spring JDBC ...