当前位置: 首页 > news >正文

设计模式-状态模式-笔记

状态模式State

在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定?“状态变化”模式为这一问题提供了一种解决方案。

经典模式:State、Memento

动机(Motivation)

在软件构建过程中,某些对象的状态如何改变,其行为也随之而发生变化,比如文档处于只读状态,其支持的行为和读写状态支持的行为就可以完全不同。

如何在运行时根据对象的状态来透明地更改对象的行为?而不会为对象操作和状态转化之间引入耦合?

示例1


enum NetworkState
{Network_Open,Network_Close,Network_Connect,NetWork_Wait    // 新增状态
};class NetworkProcessor {NetworkState state_;public:void Operation1() {if (Network_Open == state_) {//***state_ = Network_Close;}else if(Network_Close == state_){//...state_ = Network_Connect;}else if (Network_Connect == state_) {//$$$state_ = Network_Open;}// 变化else if (NetWork_Wait == state_) {//---}}void Operation2() {if (Network_Open == state_) {//***state_ = Network_Connect;}else if (Network_Close == state_){//...state_ = Network_Open;}else if (Network_Connect == state_) {//$$$state_ = Network_Close;}// 变化else if (NetWork_Wait == state_) {//---}}void Operation3() {//...}
};

示例2


class NetworkState {
public:NetworkState* pNext;virtual void Operation1() = 0;virtual void Operation2() = 0;virtual void Operation3() = 0;virtual ~NetworkState() {}
};class OpenState : public NetworkState {static NetworkState* m_instance;public:static NetworkState* getInstance() {if (nullptr == m_instance) {m_instance = new OpenState();}return m_instance;}virtual void Operation1() {//***pNext = CloseState::getInstance();}virtual void Operation2() {//...pNext = ConnectState::getInstance();}virtual void Operation3() {//$$$pNext = OpenState::getInstance();}
};class CloseState : public NetworkState {static NetworkState* m_instance;public:static NetworkState* getInstance() {if (nullptr == m_instance) {m_instance = new CloseState();}return m_instance;}virtual void Operation1() {//***pNext = ConnectState::getInstance();}virtual void Operation2() {//...pNext = OpenState::getInstance();}virtual void Operation3() {//$$$pNext = CloseState::getInstance();}
};class ConnectState : public NetworkState {static NetworkState* m_instance;public:static NetworkState* getInstance() {if (nullptr == m_instance) {m_instance = new ConnectState();}return m_instance;}virtual void Operation1() {//***pNext = OpenState::getInstance();}virtual void Operation2() {//...pNext = CloseState::getInstance();}virtual void Operation3() {//$$$pNext = ConnectState::getInstance();}
};// 扩展
class WaitState : public NetworkState {//...
};class NetworkProcessor {NetworkState* state_;public:NetworkProcessor(NetworkState* state) {this->state_ = state;}void Operation1() {//...state_->Operation1();state_ = state_->pNext;//...}void Operation2() {//...state_->Operation2();state_ = state_->pNext;//...}void Operation3() {//...state_->Operation3();state_ = state_->pNext;//...}};

要点总结

State模式将所有与一个特定状态的相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对象;但同时维持State的接口,这样实现了具体操作与状态转换之间的解耦。

为不同的状态引入不同的对象使得状态转换变得更加明确,而且可怀疑保证不会出现状态不一致的情况,因为转换是原子性的---即要么彻底转换过来,要么不转换。

如果State对象没有实例变量,那么各个上下文可怀疑共享同一个State对象,从而节省对象开销。

http://www.lryc.cn/news/233645.html

相关文章:

  • Java中for、foreach、stream区别和性能比较
  • [CSS] 文本折行
  • 033-从零搭建微服务-日志插件(一)
  • 短期经济波动:均衡国民收入决定理论(三)
  • 电力感知边缘计算网关产品设计方案-网关软件架构
  • 最新AI创作系统ChatGPT系统运营源码/支持最新GPT-4-Turbo模型/支持DALL-E3文生图
  • Java使用Redis的几种客户端介绍
  • 程序员的护城河
  • 常见面试题-MySQL软删除以及索引结构
  • 信号的机制——信号处理函数的注册
  • JS-项目实战-鼠标悬浮变手势(鼠标放单价上生效)
  • redis运维(十一) python操作redis
  • 黑马程序员微服务 第五天课程 分布式搜索引擎2
  • 什么是UV贴图?
  • 从哪里下载 Oracle database 11g 软件
  • Ingress安全网关
  • Jmeter控制RPS
  • 【Nginx】转发配置nginx.conf
  • uniapp实现下载图片到本地
  • spring cloud-注册中心(Eureka)
  • 004 OpenCV akaze特征点检测匹配
  • openRPA开源项目源码编译
  • 飞书开发学习笔记(八)-开发飞书小程序Demo
  • Unity UI 完全解决方案
  • 为什么打开idea时,没有启动页面,如何解决?
  • golang - 嵌入静态文件打包
  • SQL题
  • GUN介绍
  • 《Effective C++》条款15
  • CTFd-Web题目动态flag