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双线性变换和后向差…

leetcode 第388场周赛第三题

这道题有很多人都用的什么字符串哈希或者别的一些法子&#xff0c;这里作者用了暴力的解法。 思路&#xff1a;关键点在于我们怎么存储所给出的字符串容器中每个字符串的子串的编号并加以处理。 这里用到了一种嵌套容器&#xff1a;vector<map<string,int>>&…

leetcode 第388场周赛第一题

这里用贪心的算法就很容易能够算出来结果。 思路&#xff1a;我们知道&#xff0c;要想装的箱子数最少&#xff0c;我们需要先把大容量的箱子用上&#xff0c;然后再用小的这样才能实现局部最优。 那么我们直接对于箱子的容量进行排序&#xff0c;然后从大容量的箱子开始装就…

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

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

Apache Maven是什么?|Maven安装

Apache Maven是一款流行的Java项目管理和构建工具&#xff0c;用于自动化构建过程&#xff0c;包括编译、测试、打包、依赖管理和发布等工作。以下是Maven安装步骤解析&#xff1a; 在Windows系统中安装Maven 下载Maven&#xff1a; 访问Maven官方网站&#xff08;https://mav…

网络协议常见问题

网络协议常见问题 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函数…

Spring Security之基于方法配置权限

前言 Spring Security有两种配置方式&#xff0c;今天重点是绍基于方法配置的方式。 基于方法配置权限 这个主要是有一些注解提供给大家使用&#xff0c;今天来给大家一个demo&#xff08;参考自官方sample&#xff09;。 maven就不多累赘了。重点看看配置。 基于角色配置…

【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…

【Golang星辰图】Go语言之光照耀数据科学:揭开强大库的神秘面纱

Go语言赋能数据科学&#xff1a;探索多样化工具的无限可能 前言 在数据科学和分析领域&#xff0c;使用合适的工具和库对数据进行处理、分析和建模至关重要。本文将介绍一系列功能强大的Go语言库&#xff0c;涵盖了特征值分解、矩阵运算、深度学习、机器学习以及统计分析等方…

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)) …

SpringBoot中实现API速率限制的令牌桶算法项目

这个github项目是利用Bucket4j以及 Redis 缓存和 Spring Security 过滤器对私有 API 端点实施速率限制。 需要升级到 Spring Boot 3 和 Spring Security 6 关键组件&#xff1a; RedisConfiguration.javaRateLimitingService.javaRateLimitFilter.javaBypassRateLimit.javaP…