设计模式-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)
一.引言 在上一篇文章介绍到可以使用状态者模式和观察者模式来解决中介者模式存在的问题,在本文中将首先通过一个银行账户的例子来解释状态者模式,通过这个例子使大家可以对状态者模式有一个清楚的认识,接着,再 ...
随机推荐
- Ubuntu 18.04安装MySQL
安装 MySQL 服务端 sudo apt-get install mysql-server 等待安装完成. 检查 mysql 服务状态 servive mysql status 登录 mysql 客 ...
- iOS---------金额转大写
-(NSString *)digitUppercase:(NSString *)numstr{ double numberals=[numstr doubleValue]; NSArray *numb ...
- ORA-27090: Unable to reserve kernel resources for asynchronous disk I/O
2019-08-19T09:27:33.225584+08:00Slave encountered ORA-27090 exception during crash recoveryRecovery ...
- 《收获,不止SQL优化》这本书,有很多即用的脚本工具,或者根据自己的需求,改造重用,可以积累到自己的工具库中。
以下两个脚本,官方来源: https://github.com/liangjingbin99/shouhuo/tree/master/%E7%AC%AC05%E7%AB%A0 1. 找出未使用绑定变量 ...
- screen工具的安装与使用
yum install screen 安装screen screen -S <作业名称> 创建新的页 screen -ls 查询已经存在的页面 screen -r < ...
- 程序员:May the Force be with you!
程序员如何理解:May the Force be with you! 我们并没有向其他人那样讨论现象级产品的生成原因,因为我们并不清楚这个原因是什么. 我们也不知道足记是否会重复过去一些现象级产品忽生 ...
- 32.Java基础_异常
JVM虚拟机默认异常处理机制 Java异常处理: 1.try...catch... 2.throw 1.try...catch... public class test{ public static ...
- Oracle 11gR2中HR用户安装说明
1.脚本下载: 链接: 1,脚本放在这个目录下$ORACLE_HOME/demo/schema/human_resources hr_analz.sql hr_code.sq ...
- 《Netty Redis Zookeeper 高并发实战》声明
疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 这里, 对疯狂创客圈 <Netty Redis Zookeeper 高并发实战> 一书,进行一些必要说明. ...
- SpringCloud 服务间互相调用 @FeignClient注解
SpringCloud搭建各种微服务之后,服务间通常存在相互调用的需求,SpringCloud提供了@FeignClient 注解非常优雅的解决了这个问题 首先,保证几个服务都在一个Eureka中注册 ...