设计模式(4)--对象行为(8)--状态

news2024/10/5 17:51:26
1. 意图

    允许一个对象在其内部状态改变时改变它的行为。

2. 三种角色

    上下文环境(Context)、抽象状态(State)、具体状态(Concrete State)

3. 优点

    3.1 将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

    3.2 使得状态转换显式化。

    3.3 State对象可被共享。

4. 缺点

    4.1 增加了子类的数目

5. 相关模式

    5.1 状态对象通常用享元模式实现

    5.2 状态对象通常是单件

6. 代码示意(C++)
#pragma once
#include <iostream>
using namespace std;

class Context;

class State
{
public:
	virtual void Handle(Context* pContext) = 0;
protected:
	State() {}
	void ChangeState(Context* pContext, State* pState);
};

class ConcreteStateA :public State
{
	static ConcreteStateA* s_instance;
public:
	static State* Instance() {
		if (0 == s_instance) {
			s_instance = new ConcreteStateA;
		}
		return s_instance;
	}
	static void DelInstance() {
		delete s_instance;
	}
public:
	virtual void Handle(Context* pContext);
protected:
	ConcreteStateA() {}
};

class ConcreteStateB :public State
{
	static ConcreteStateB* s_instance;
public:
	static State* Instance() {
		if (0 == s_instance) {
			s_instance = new ConcreteStateB;
		}
		return s_instance;
	}
	static void DelInstance() {
		delete s_instance;
	}
public:
	virtual void Handle(Context* pContext);
protected:
	ConcreteStateB() {}
};

class Context
{
	State* m_pState;
public:
	Context() {
		m_pState = ConcreteStateA::Instance();
	}
	void Request() {
		if (0 != m_pState) {
			m_pState->Handle(this);
		}
	}
private:
	friend class State;
	void ChangeState(State* pState) {
		m_pState = pState;
	}
};

State.cpp:

#include "State.h"

ConcreteStateA* ConcreteStateA::s_instance = 0;
ConcreteStateB* ConcreteStateB::s_instance = 0;

void State::ChangeState(Context* pContext, State* pState) {
	pContext->ChangeState(pState);
}

void ConcreteStateA::Handle(Context* pContext) {
	cout << "ConcreteStateA handled" << endl;
	ChangeState(pContext, ConcreteStateB::Instance());
}

void ConcreteStateB::Handle(Context* pContext) {
	cout << "ConcreteStateB handled" << endl;
}
#include "State.h"
int main() {

	Context* pContext = new Context();
	pContext->Request();
	pContext->Request();

	delete pContext;

	return 0;
}

运行结果:

  6.1 不同的ConcreteState,对应不同的处理方法(3.1)

  6.2 状态对象比多个一般变量更明确,更容易理解和管理(3.2)

  6.3 代码里的状态对象是单例共享的(3.3)

  6.4 一个ConcreteState需要知道下一个状态是谁。

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

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

相关文章

2024年医院设备维修培训安排

在你还考虑该不该干的时候别人已经走好远了 小时候觉得忘带作业是天大的事&#xff0c;高中的时候&#xff0c;觉得考不上大学是天大的事&#xff0c;恋爱的时候&#xff0c;觉得跟喜欢的人分开是天大的事&#xff0c;到现在回头看看&#xff0c;那些难以跨过的山&#xff0c;…

EST-100身份证社保卡签批屏按捺终端PC版web版本http协议接口文档,支持web网页开发对接使用

<!DOCTYPE html><html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,initial-scale1.0"><title>演示DEMO</title><script type"text/…

深入理解Mysql MHA高可用集群搭建:从实验到实战

1. 简介 MHA&#xff08;Master High Availability&#xff09;是一个高效的开源MySQL高可用性解决方案。由日本开发者yoshinorim&#xff08;前DeNA员工&#xff0c;现在Facebook&#xff09;创建&#xff0c;MHA支持MySQL的主从复制架构&#xff0c;自动化主节点故障转移。当…

EMC指令是什么?

摘要: EMC指令是欧盟颁布的一系列法规&#xff0c;旨在规范电子产品的电磁兼容性&#xff08;Electromagnetic Compatibility&#xff0c;EMC&#xff09;。这些指令要求产品在正常操作时不会产生电磁干扰&#xff0c;也不会对其他设备造成影响&#xff0c;同时能够抵御外部电磁…

什么是骨传导耳机?骨传导能保护听力吗?

骨传导耳机是一种非常特殊的蓝牙耳机&#xff0c;它通过骨传导技术将声音直接传送到内耳。这种技术不同于传统耳机&#xff0c;它不通过空气传送声音&#xff0c;而是通过头骨的振动来传送声音。 并且骨传导耳机能够在一定程度上起到保护听力的作用&#xff0c;主要是因为它们不…

vite + javascript 创建纯 javascript项目

1、环境搭建&#xff1a;需要安装 node 管理器命令&#xff1a;安装了node的后&#xff0c;可以使用 npm &#xff0c;也可以安装使用 cnpm / pnpm 下载 cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org 下载 pnpm npm i -g pnpm pnpm config set r…

ssm基于JavaWeb的校园心理健康网站的设计与实现论文

摘 要 如今的时代&#xff0c;是有史以来最好的时代&#xff0c;随着计算机的发展到现在的移动终端的发展&#xff0c;国内目前信息技术已经在世界上遥遥领先&#xff0c;让人们感觉到处于信息大爆炸的社会。信息时代的信息处理肯定不能用之前的手工处理这样的解决方法&#x…

大创项目推荐 深度学习OCR中文识别 - opencv python

文章目录 0 前言1 课题背景2 实现效果3 文本区域检测网络-CTPN4 文本识别网络-CRNN5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习OCR中文识别系统 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;…

提升FTP上传速度的方法(提升FTP下载速度的技巧)

在企业日常经营中&#xff0c;快速上传和下载文件至关重要。然而&#xff0c;在使用FTP&#xff08;文件传输协议&#xff09;进行文件传输时&#xff0c;速度可能成为瓶颈。为了提升工作效率&#xff0c;以下是一些建议&#xff0c;可以帮助企业提高FTP上传下载速度。 1、确保…

【赠书第14期】AI短视频制作一本通:文本生成视频+图片生成视频+视频生成视频

文章目录 前言 1 前期准备 2 拍摄与录制 3 后期编辑 4 技巧与注意事项 5 推荐图书 6 粉丝福利 前言 随着智能技术的迅猛发展&#xff0c;AI 短视频制作成为了一种新兴而创新的表达方式&#xff0c;广泛应用于社交媒体、广告营销、教育培训等领域。本文将介绍 AI 短视频…

VD6283TX环境光传感器(2)----移植闪烁频率代码

VD6283TX环境光传感器----2.移植闪烁频率代码 闪烁定义视频教学样品申请源码下载参考代码硬件准备开发板设置生成STM32CUBEMX串口配置IIC配置X-CUBE-ALSADC使用定时器触发采样KEIL配置FFT代码配置app_x-cube-als.c需要添加函数演示结果 闪烁定义 光学闪烁是指人造光源产生的光…

uniapp中uview组件库的Search 搜索 的用法

目录 基本使用 #设置输入框形状 #是否开启清除控件 #是否开启右边控件 #自定义样式 API #Props #Events 基本使用 通过placeholder参数设置占位内容通过v-model双向绑定一个变量值&#xff0c;设置初始化时搜索框的值&#xff0c;如果初始内容为空&#xff0c;那么请绑…

Thinkphp开发的返佣商城分销商城理财商城源码

&#xff08;本站长在localhost安装测试&#xff0c;发现提示有错&#xff0c;具体问题没有时间查找了&#xff0c;或者php解密插件没有安装&#xff0c;有能力的朋友自行折腾。&#xff09; 程序基于 THINKPHP6VUE 全新开发&#xff0c;保障安全的同时大大提高代码执行效率。…

基于梯度和频率域的深度超分辨率新方法笔记二

一、实现方法和网络结构的剖析 1.1 网络结构 梯度校准模块(GCM)和频率感知模块&#xff08;FAM&#xff09; 1&#xff09;梯度校准模块(GCM) 1、使用梯度映射函数&#xff08;如下图所示&#xff09;&#xff0c;将RGB和LR深度图映射到梯度域 2、再梯度域中使用RGB的梯度特…

彭涛:2023年终复盘,工作,团队,个人!

眨眼2023即将结束&#xff0c;2024即将开启&#xff0c;每年这个时候&#xff0c;都会简单总结下自己这一年&#xff0c;既是对今年的一个复盘和回顾&#xff0c;也是对新一年的向往和期待。 我的2023年&#xff0c;大概分为 「个人」&#xff0c;「家庭」&#xff0c;「团队」…

C语言——指针题目“指针探测器“

如果你觉得你指针学的自我感觉良好&#xff0c;甚至已经到达了炉火纯青的地步&#xff0c;不妨来试试这道题目&#xff1f; #include<stdio.h> int main() {char* c[] { "ENTER","NEW","POINT","FIRST" };char** cp[] { c 3…

【漏洞修复】页面包含错误信息,其中可能包含敏感信息,这些信息可以帮助攻击者对站点进一步的攻击

1、漏洞描述 2、测试数据包 3、tomcat修复 修改tomcat conf下的server.xml relaxedQueryChars"[]|{}^&#x5c;&#x60;&quot;<>"

初识隧道代理HTTP:理解基础概念的重要性

嗨&#xff0c;小伙伴们&#xff01;如果你对网络世界充满好奇&#xff0c;那么这篇文章就是为你准备的。我们将一起踏上一段奇妙的旅程&#xff0c;探索一个叫做“隧道代理HTTP”的新领域。但在这之前&#xff0c;我们需要先穿上“基础概念”的防护服&#xff0c;以免被这个复…

演员-评论家算法:多智能体强化学习核心框架

演员-评论家算法 演员-评论家算法&#xff1a;策略梯度算法 DQN 算法演员-评论家的协作流程演员&#xff1a;策略梯度算法计算智能体策略预期奖励的梯度公式分解时间流程拆解 通过采样方法近似估计梯度公式拆解时间流程拆解 改进策略设置基线&#xff1a;适用于减小方差、加速…

Vue监听浏览器自带的复制事件并对复制内容进行修改

场景&#xff1a; 在使用鼠标右键或者ctrl c的时候。光标会自动换行。粘贴出来的数据光标应该在红色部分&#xff0c;却出现在了黑色部分。 方法一&#xff1a; html标签不要换行&#xff1b;css去除空格&#xff1b; white-space: nowrap;方法二&#xff1a; 使用函数对复…