21、状态模式(行为性模式)

版本一、get状态指针

#include <iostream>
using namespace std;//前置声明
class Context;//状态
class State{
public://4个状态virtual void toUp   (Context& context){ }virtual void toDown (Context& context){ }virtual void toLeft (Context& context){ }virtual void toRight(Context& context){ }//显示用virtual void print(){}  
};    //Context
class Context{
public:Context(State *st ):st(st){ }void reset( State* st ){     this->st = st;}State* get(){  //获取私有状态指针return st;}~Context(){ delete st; }
private:State* st;
};//具体状态Up
class Up :public State {
public:virtual void print(){cout << "now Up\n";}virtual void toDown(Context& context);
};//具体状态Down
class Down:public State {
public:virtual void print(){cout << "now Down\n";}virtual void toUp(Context& context);
};//
void Up::toDown(Context& context) {context.~Context();context.reset( new Down );    
}
void Down::toUp(Context& context) {context.~Context();context.reset(new Up );    
}int main() 
{Context c(new Up);     //定义对象( c.get() )->print();  //当前状态( c.get() )->toDown(c); // c 转换状态( c.get() )->print();    //转换过的状态return 0;
}

版本二、统一接口

#include <iostream>//前置声明
class Context;//状态
class State{
public://4个状态virtual void toUp   (Context& context){ }virtual void toDown (Context& context){ }virtual void toLeft (Context& context){ }virtual void toRight(Context& context){ }//显示用virtual void print(){}  
};    //Context
class Context{
public:Context(State *st ):st(st){ }void reset( State* st ){     this->st = st;}//统一接口void toUp   (){ st->toUp(*this); }void toDown (){ st->toDown(*this); }void toLeft (){ st->toLeft(*this); }void toRight(){ st->toRight(*this); }void print  (){st->print(); }~Context(){ delete st; }
private:State* st;
};//具体状态Up
class Up :public State {
public:virtual void print(){std:: cout << "now Up\n";}virtual void toDown(Context& context);
};//具体状态Down
class Down:public State {
public:virtual void print(){std:: cout << "now Down\n";}virtual void toUp(Context& context);
};//类外定义
void Up::toDown(Context& context) {context.~Context();context.reset( new Down );    
}
void Down::toUp(Context& context) {context.~Context();context.reset(new Up );    
}int main() 
{Context c(new Up);     //定义对象c.print();  //当前状态c.toDown(); // 转换状态c.print();  //转换过的状态return 0;
}

版本三、成员函数指针数组

#include <iostream>//前置声明
class Context;//状态
class State{
public://4个状态virtual void toUp   (Context& context){ }virtual void toDown (Context& context){ }virtual void toLeft (Context& context){ }virtual void toRight(Context& context){ }//成员函数指针数组enum Direction { TOUP,TODOWN,TOLEFT,TORIGHT };typedef void (State::*Action)(Context& context); //Action是可以指向,任何表示方向的成员函数指针static Action Menu[]; //成员函数指针数组//显示用virtual void print(){}  
}; 
//成员函数指针数组初始化   
State::Action Menu[] = { &State::toUp,&State::toDown,&State::toLeft,&State::toRight };  //Context
class Context{
public:Context(State *st ):st(st){ }void reset( State* st ){     this->st = st;}//转换状态void conversionState( State::Direction d ){(st->*Menu[d])(*this);}void print  (){st->print(); }~Context(){ delete st; }
private:State* st;
};//具体状态Up
class Up :public State {
public:virtual void print(){std:: cout << "now Up\n";}virtual void toDown(Context& context);
};//具体状态Down
class Down:public State {
public:virtual void print(){std:: cout << "now Down\n";}virtual void toUp(Context& context);
};//类外定义
void Up::toDown(Context& context) {context.~Context();context.reset( new Down );    
}
void Down::toUp(Context& context) {context.~Context();context.reset(new Up );    
}int main() 
{Context c(new Up);     //定义对象c.print();  //当前状态c.conversionState( State::TODOWN ); // 转换状态c.print();  //转换过的状态return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/736184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构学习总结:企业架构=业务+数据+技术+应用架构

最近再次研读DAMA数据管理知识体系,结合工作对什么是企业架构?如何开展企业架构设计工作有一些新的认识,供大家参考。企业架构包括企业的业务架构、数据架构、技术架构和应用架构,要想做好企业的信息化数字化建设规划,这四个架构都不可缺少,这四个方面的内容共同组成了企…

[云原生] k8s配置资源管理

一、Secret的资源配置 1.1 Secret配置的相关说明 Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源&#xff0c;这类数据虽然也可以存放在 Pod 或者镜像中&#xff0c;但是放在 Secret 中是为了更方便的控制如何使用数据&#xff0c;并减少暴露的风险。 Secret 有…

【JavaSE】抽象类与接口

Object 类 类 java.lang.Object是类层次结构的根类&#xff0c;即所有类的父类。 除Object类之外的任何一个Java类&#xff0c;全部直接或间接的继承于Object类。由此&#xff0c;Object类也被称为根父类。Object类中声明的成员具有通用性&#xff0c;并且Object类中没有声明…

300W-500W-700W-1000W超薄制动电阻

EAK制动电阻&#xff0c;最大连续功率&#xff1a;300 W--1000W 制动电阻器&#xff0c;用于带有中低功率变频器 或作为充电电阻器的驱动器。 安装在变频器附近。 防护等级 IP 20 / IP 54 可根据要求提供更高的防护等级 测试电压 2.5 kV AC 可根据要求提供其他容量和安装…

SMART PLC自适应低通滤波器(收放卷线速度滤波)

一阶低通滤波器更多内容请参考信号处理专栏相关文章,常用链接如下: 1、SMART PLC 低通滤波器和模拟量采集应用 https://rxxw-control.blog.csdn.net/article/details/136595982https://rxxw-control.blog.csdn.net/article/details/1365959822、SMART PLC双线性变换和后向差…

Docker笔记-进入运行中的镜像,查看日志等操作

docker搭建好后&#xff0c;查看运行的docker镜像&#xff1a; docker ps -a 进入运行的容器&#xff0c;命令如下&#xff1a; docker exec -it <容器ID> /bin/bash # 或者&#xff0c;直接用容器里面的命令&#xff0c;比如mysql镜像 docker exec -it <容器ID>…

网络协议常见问题

网络协议常见问题 OSI&#xff08;Open Systems Interconnection&#xff09;模型OSI 封装 TCP/IP协议栈IP数据报的报头TCP头格式UDP头格式TCP (3-way shake)三次握手建立连接&#xff1a;为什么三次握手才可以初始化 Socket、序列号和窗口大小并建立 TCP 连接。每次建立TCP连接…

蓝桥杯单片机---第十二届省赛题目解析

文章目录 比赛题目一、代码相关定义、声明1.头文件声明2.变量声明 二、主要函数1.main函数2.按键扫描3.数码管显示4.电压模式1、2输出 & LED显示5.定时器中断6.消除85C显示 三、次要函数1.初始化函数Init2.按键函数Key3.LED函数Led4.数码管函数Seg5.iic函数中6.onewire函数…

【LeetCode】17.电话号码的字母组合

题目 链接&#xff1a;17. 电话号码的字母组合 - 力扣&#xff08;LeetCode&#xff09; 给定一个仅包含数字2-9的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按任意顺序返回 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何…

Vue ECharts line3D点击空白处重置图表视角- 附完整示例

ECharts&#xff1a;一个基于 JavaScript 的开源可视化图表库。 目录 效果 一、介绍 1、官方文档&#xff1a;Apache ECharts 2、官方示例 二、准备工作 1、安装依赖包 2、示例版本 三、使用步骤 1、在单页面引入 echarts 2、指定容器并设置容器宽高 3、数据处理&…

leetcode 热题 100_反转链表

题解一&#xff1a; 迭代&#xff1a;逐步修改节点指针&#xff0c;注意在修改前要保存下一个节点指针。 class Solution {public ListNode reverseList(ListNode head) {ListNode pre null;while (head! null) {ListNode temp head.next;head.next pre;pre head;head te…

使用Canvas绘制一个自适应长度的折线图

要求x轴根据数据长度自适应 y轴根据数据最大值取长度值 <template><div ref"cvsContainer" class"cvs-container"><canvas ref"cvs" class"canvas"></canvas></div> </template><script set…

Chapter20-Ideal gases-CIE课本要点摘录、总结

20.1 Particles of a gas Brownian motion Fast modules 速率的数值大概了解下&#xff1a; average speed of the molecules:400m/s speed of sound:approximately 330m/s at STP&#xff08;standard temperature and pressure&#xff09; Standard Temperature and Pres…

计算表达式x*(2^i)的值math.ldexp(x, i)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算表达式x*(2^i)的值 math.ldexp(x, i) [太阳]选择题 关于以下代码输出的结果说法正确的是&#xff1f; import math print("【执行】math.ldexp(3,2)") print(math.ldexp(3,2)) …

HTML5+CSS3+移动web——CSS基础

系列文章目录 HTML5CSS3移动web——HTML 基础-CSDN博客https://blog.csdn.net/ymxk2876721452/article/details/136070953?spm1001.2014.3001.5501HTML5CSS3移动web——列表、表格、表单-CSDN博客https://blog.csdn.net/ymxk2876721452/article/details/136221443?spm1001.2…

【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

wordpress博客趣主题个人静态网页模板

博客趣页面模板适合个人博客&#xff0c;个人模板等内容分享。喜欢的可以下载套用自己熟悉的开源程序建站。 博客趣主题具有最小和清洁的设计&#xff0c;易于使用&#xff0c;并具有有趣的功能。bokequ主题简约干净的设计、在明暗风格之间进行现场切换。 下载地址 清新个人…

【金三银四】Spring面试题

目录 1、什么是Spring2、说一下Spring的IOC3、Spring的AOP4、连接点&#xff1f;切入点&#xff1f;5、Spring AOP 是通过什么实现的6、Spring Bean的生命周期是怎么样的&#xff1f;7、Spring Bean的初始化过程是怎么样8、Spring的事务传播机制有哪些&#xff1f;9、Autowired…

割点原理及封装好的割点类

作者推荐 视频算法专题 预备知识 本分析针对&#xff1a;连通无向图G。 搜索树 节点的父子关系&#xff1a;任意 节点的邻接 节点除了已处理 节点&#xff0c;都是它的子 节点。 以任意一点为根开始DFS&#xff0c;计算所有 节点的父子关系。只保留个子 节点到父 节点形成…

Visual Studio单步调试中监视窗口变灰的问题

在vs调试中&#xff0c;写了这样一条语句 while((nfread(buf, sizeof(float), N, pf))>0) 然而&#xff0c;在调试中&#xff0c;只要一执行while这条语句&#xff0c;监视窗口中的变量全部变为灰色&#xff0c;不能查看&#xff0c;是程序本身并没有报错&#xff0c;能够继…