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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux报错排查-刚安装好的ubuntu系统无法ssh连接

Linux运维工具-ywtool 目录 一.问题描述二.问题解决2.1 先给ubuntu系统配置阿里云源2.2 安装openssh-server软件2.3 在尝试ssh连接,可以连接成功了 三.其他命令 一.问题描述 系统:ubuntu-18.04-desktop-amd64 系统安装完后,想要通过xshell软件连接系统,发现能Ping通系统的IP,但…

视频水印怎么轻松去除?这三款神器让您直呼过瘾!

在现代社会&#xff0c;视频内容日益丰富多样&#xff0c;但有时我们更希望获得视频中的文字文稿&#xff0c;以便于搜索、编辑或传播。下面我将为您介绍三款优秀的视频转文字工具&#xff0c;它们能够帮助您快速、准确地将视频内容转换为可编辑的文字格式。让我们一起来看看这…

STM32的启动流程分析 和 一些底层控制的原理

阅读引言&#xff1a; 阅读本文之后&#xff0c; 你将对单片机&#xff0c; 甚至是嵌入式系统&#xff0c; 或者是传统的PC机系统的启动流程有一个大致的了解&#xff0c; 本文更加偏向于单片机的启动流程分析。 目录 一、基础知识 1.STM32系列的微控制器&#xff08;mcu&…

【打工日常】使用docker部署IT运维管理平台CAT

​一、CAT介绍 CAT是一个专为 IT 运维从业者打造的一站式解决方案平台&#xff0c;包含资产管理、工单、工作流、仓储等功能模块。 本项目是celaraze/chemex重构版&#xff0c;原项目chemex名称弃用&#xff1b;CAT采用全新架构设计&#xff0c;大量提升使用体验的细节&#xf…

拼多多1000元虚拟店铺免4万保证金

众所周知拼多多现在流量非常大&#xff0c;虚拟也算是蓝海&#xff0c;想做的人大部分都被保证金拦在门外&#xff0c;高达4W的保证金不是每个人都能承受的&#xff0c;正好在当下有一个方法可以解决这个苦恼。 拼多多虚拟店铺免保证金玩法现在处于前期阶段&#xff0c;很多人…

付强:基于注意力机制的听觉前端处理 | 嘉宾公布

一、智能家居与会议系统专题论坛 智能家居与会议系统专题论坛将于3月28日同期举办&#xff01; 智能会议系统它通过先进的技术手段&#xff0c;提高了会议效率&#xff0c;降低了沟通成本&#xff0c;提升了参会者的会议体验。对于现代企业、政府机构和学术界是不可或缺的。在这…

5款免费且出色的ai智能ppt制作软件,值得拥有!

如果说2023是AI崛起的元年&#xff0c;那2024无疑是AI应用的真正元年&#xff0c;人们对AI技术逐渐回归理性&#xff0c;关注的焦点也从产品层转向应用层&#xff0c;探索AI如何更好地赋能业务&#xff0c;或是重塑工作流程&#xff0c;让AI真正为自己所用。 在数字化盛兴的当…

如何利用生成式人工智能助力短视频剧本创作?

短视频已成为现代人获取娱乐和信息的一种流行方式。不同于传统的电影和电视剧&#xff0c;短视频的时长通常较短&#xff0c;内容形式多样&#xff0c;更适合快节奏的社会生活。本文将讨论如何编写短视频剧本&#xff0c;以及它与传统故事在结构和内容上的区别。 简介 短视频剧…

docker拉取镜像失败的解决方案大全

更换国内源 创建或修改 /etc/docker/daemon.json 文件&#xff0c;修改&#xff1a; {"registry-mirrors" : ["https://registry.docker-cn.com","http://hub-mirror.c.163.com","https://docker.mirrors.ustc.edu.cn","https:…

图文并茂的讲清楚Linux零拷贝技术

今天我们来聊一聊Linux零拷贝技术&#xff0c;今天我们以一个比较有代表性的技术sendfile系统调用为切入点&#xff0c;详细介绍一下零拷贝技术的原理。 1.零拷贝技术简介 Linux零拷贝技术是一种优化数据传输的技术&#xff0c;它可以减少数据在内核态和用户态之间的拷贝次数&…

c8t6,hal库,pwm输出

1.cubemx配置 设置分配系数&#xff1a;71&#xff1b; 自动重装在计数值&#xff1a;499&#xff1b; 72MHZ/(711) 1MHZ&#xff1b; 1MHZ即1秒计数1000000次&#xff1b; 即1毫秒计数1000次&#xff1b; 自动重装载计数值设置为499&#xff1b;即0.5ms一个周期&#xff…

新方法简单无成本申请网易云/腾讯音乐人

外面接单申请的音乐人是原创音乐人&#xff0c;通过这个方法申请的只是翻唱音乐人 如果你不想通过音乐平台赚钱的话&#xff0c;其实这两个音乐人都没什么区别 无非就是原创音乐人多了个作词、作曲的标签 翻唱音乐人一样可以领酷狗会员 音乐人特权&#xff1a; 酷狗音乐人…

@require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法

require_PUT 是一个自定义的装饰器&#xff0c;它在你的Django项目中并不存在。在Django中&#xff0c;没有内置的 require_PUT 装饰器&#xff0c;但你可以使用 require_http_methods 装饰器来限制视图函数接受的HTTP请求方法。 你可以将 require_PUT 替换为 require_http_me…

SPFA找负环

2024-01-31&#xff08;最短路径&#xff09;-CSDN博客 求负环的常用方法&#xff0c;基于spfa&#xff1a; 1.统计每个点入队的次数&#xff0c;如果有个点入队n次&#xff0c;则说明存在负环 2.统计当前每个点的最短路中包含的边数&#xff0c;如果某个点的最短路的所包含的边…

2024年新版CMS内容管理使用,不用回退老版本 使用最新小程序云开发cms内容模型

一&#xff0c;问题描述 最近越来越多的同学找石头哥&#xff0c;说cms用不了&#xff0c;其实是小程序官方最近又搞大动作了&#xff0c;偷偷的升级的云开发cms&#xff08;内容管理&#xff09;以下都称cms&#xff0c;不升级不要紧&#xff0c;这一升级&#xff0c;就导致我…

uniapp列表进入动画

一、目前使用的是uni-list-chat的uniapp组件,可以自己定义的样式 <template><view class="container"><uni-list-chat title="uni-app" avatar="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/unicloudlogo.png"note=&quo…

Linux 网络监控工具

企业依靠其网络基础设施向客户和最终用户提供数字服务&#xff0c;这些环境包括 Windows 和 Linux 网络设备。与 Windows 网络相比&#xff0c;带有 GUI 的 Windows 网络相对易于管理&#xff0c;而 Linux 网络提供了更大的灵活性和高级级别的自定义。 由于操作系统有助于部署…

mysql中两千万大表做时间范围查询很慢,怎么解决

预备知识 1、一个表的数据量达到好几千万或者上亿时&#xff0c;加索引的效果没那么明显啦。性能之所以会变差&#xff0c;是因为维护索引的B树结构层级变得更高了&#xff0c;查询一条数据时&#xff0c;需要经历的磁盘IO变多&#xff0c;因此查询性能变慢。 少量数据可以考…

Day16:信息打点-语言框架开发组件FastJsonShiroLog4jSpringBoot等

目录 前置知识 指纹识别-本地工具-GotoScan&#xff08;CMSEEK&#xff09; Python-开发框架-Django&Flask PHP-开发框架-ThinkPHP&Laravel&Yii Java-框架组件-Fastjson&Shiro&Solr&Spring 思维导图 章节知识点 Web&#xff1a;语言/CMS/中间件/…

wy的leetcode刷题记录_Day83

wy的leetcode刷题记录_Day83 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2024-3-8 前言 目录 wy的leetcode刷题记录_Day83声明前言2834. 找出美丽数组的最小和题目介绍思路代码收获 328. 奇偶链表题目介绍思路代码收获 355. 设计推特…