设计模式(8)-状态模式(关注状态之间的变化)

简介: 状态模式(State Pattern)是设计模式的一种,属于行为模式。   定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。   状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。
状态模式(State Pattern)是设计模式的一种,属于行为模式。
   定义(源于Design Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
  状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
   意图:允许一个对象在其内部状态改变时改变它的行为
   适用场景:
  1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。

  2.一个操作中含有庞大的多分支结构,并且这些分支决定于对象的状态。

类图结构:

img_dfbb447f562d5fe221534e1897599bbf.jpg

这样的话让程序更加面向对象

状态模式的好处是将与特定状态相关的行为局部化,并且将不同的状态行为分割开来。
 目的就是消除庞大的分支语句,状态模式通过把各种状态转移逻辑分布到state的子类之间,
 来减少相互间的依赖。
 什么时候使用?
 当一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为时,就可以
 考虑状态模式。

参考代码如下:

#ifndef _STATE_H_
#define _STATE_H_
#include <iostream>
#include <string>

using namespace std;

class Work;

class State{
public:
	virtual void writeProgram(Work* work) = 0;
};
//12 before
class ForenoonState : public State{
public:
	void writeProgram(Work* work);
};
//12 ~ 13 middle
class MoonState:public State{
public:
	void writeProgram(Work* work);
};

//12 ~ 13 middle
class AfterMoonState:public State{
public:
	void writeProgram(Work* work);
};

//晚间
class EveningState:public State{
public:
	void writeProgram(Work* work);
};
//休息
class RestState:public State{
public:
	void writeProgram(Work* work);
};
//睡觉
class SleepingState:public State{
public:
	void writeProgram(Work* work);
};

class Work{
private:
	State* m_current;
	int m_hour;
	bool m_finish;
public:
	Work(void):m_current(NULL),m_finish(false),m_hour(0){
		m_current = new ForenoonState();
	}
	int getHour(void){
		return m_hour;
	}
	void setHour(const int hour){
		m_hour = hour;
	}
	bool getIsFinished(void){
		return m_finish;
	}
	void setFinishFlag(const bool bFinished){
		m_finish = bFinished;
	}
	void setState(State* state){
		m_current = state;
	}
	void writeProgram(){
		m_current->writeProgram(this);
	}
};

void ForenoonState::writeProgram(Work* work){
	if(work->getHour()<12){
		cout<<"当前时间:"<<work->getHour()<<"点 上午工作,精神百倍"<<endl;
	}else{
		work->setState(new MoonState());
		work->writeProgram();
	}
}

void MoonState::writeProgram(Work* work){
	if(work->getHour()<13){
		cout<<"当前时间:"<<work->getHour()<<"点 午休,得去吃饭了!"<<endl;
	}else{
		work->setState(new AfterMoonState());
		//work->writeProgram();
	}
}

void AfterMoonState::writeProgram(Work* work){
	if(work->getHour()<17){
		cout<<"当前时间:"<<work->getHour()<<"点 下午状态还可以,继续努力!"<<endl;
	}else{
		work->setState(new EveningState());
		work->writeProgram();
	}
}

void EveningState::writeProgram(Work* work){
	if(work->getIsFinished()){
		work->setState(new RestState());
		work->writeProgram();
	}else{
		if(work->getHour()<21){
			cout<<"当前时间:"<<work->getHour()<<"点 加班啊,疲惫之极!"<<endl;
		}else{
			work->setState(new SleepingState());
			work->writeProgram();
		}
	}
}

void RestState::writeProgram(Work* work){
	cout<<"当前时间:"<<work->getHour()<<"点 下班回家了!"<<endl;
}

void SleepingState::writeProgram(Work* work){
	cout<<"当前时间:"<<work->getHour()<<"点 不行了睡着了!"<<endl;
}

#endif

void main(){
	Work* work = new Work();
	work->setHour(9);
	work->writeProgram();
	work->setHour(10);
	work->writeProgram();
	work->setHour(12);
	work->writeProgram();
	work->setHour(13);
	work->writeProgram();
	work->setHour(14);
	work->writeProgram();
	work->setHour(17);
	work->writeProgram();
	
	work->setFinishFlag(false);
	work->writeProgram();
	
	work->setHour(19);
	work->writeProgram();
	work->setHour(21);
	work->writeProgram();
}

对于状态频繁变更需要考虑状态模式。

目录
相关文章
|
机器学习/深度学习 编解码 Shell
|
存储 NoSQL 关系型数据库
为什么MySQL不使用红黑树做索引
本文详细探讨了MySQL索引机制,解释了为何添加索引能提升查询效率。索引如同数据库的“目录”,在数据量庞大时提高查询速度。文中介绍了常见索引数据结构:哈希表、有序数组和搜索树(包括二叉树、平衡二叉树、红黑树、B-树和B+树)。重点分析了B+树在MyISAM和InnoDB引擎中的应用,并讨论了聚簇索引、非聚簇索引、联合索引及最左前缀原则。最后,还介绍了LSM-Tree在高频写入场景下的优势。通过对比多种数据结构,帮助理解不同场景下的索引选择。
379 6
|
Java 数据库连接 数据库
|
7月前
|
数据采集 人工智能 测试技术
Python有哪些好用且实用的Web框架?
Python 是一门功能强大的编程语言,在多个领域中得到广泛应用,包括爬虫、人工智能、游戏开发、自动化测试和 Web 开发。在 Web 开发中,Python 提供了多种框架以提高效率。以下是几个常用的 Python Web 框架:1) Django:开源框架,支持多种数据库引擎,适合新手;2) Flask:轻量级框架,基于简单核心并通过扩展增加功能;3) Web2py:免费开源框架,支持快速开发;4) Tornado:同时作为 Web 服务器和框架,适合高并发场景;5) CherryPy:简单易用的框架,连接 Web 服务器与 Python 代码。这些框架各有特色,可根据需求选择合适的工具。
368 14
|
7月前
|
API PHP 数据库
PhalApi 2.x:让PHP接口开发从“简单”到“极简”的开源框架
PhalApi 2.x 是一款专为接口开发设计的轻量级PHP框架,性能卓越且易于上手。它支持多协议、自动生成文档、提供多种客户端SDK,并采用现代化技术栈,适合中小型项目及微服务架构。通过清晰的分层架构和丰富的扩展库,开发者可快速构建高可用API。其日均超1000万次调用,广泛应用于移动App、物联网、电商等领域。官网:https://www.phalapi.net/,欢迎体验高效开发之旅!
|
9月前
|
传感器 人工智能 机器人
【01】人形机器人研究试验-被有些网友痛骂“工业垃圾”“人工智障”上春晚的人形AI机器人-宇树科技机器人到底怎么样??-本系列优雅草卓伊凡亲自尝试下人形机器人的制造-从0开始学习并且制作机器人-可以跟随卓伊凡
【01】人形机器人研究试验-被有些网友痛骂“工业垃圾”“人工智障”上春晚的人形AI机器人-宇树科技机器人到底怎么样??-本系列优雅草卓伊凡亲自尝试下人形机器人的制造-从0开始学习并且制作机器人-可以跟随卓伊凡
521 1
【01】人形机器人研究试验-被有些网友痛骂“工业垃圾”“人工智障”上春晚的人形AI机器人-宇树科技机器人到底怎么样??-本系列优雅草卓伊凡亲自尝试下人形机器人的制造-从0开始学习并且制作机器人-可以跟随卓伊凡
|
10月前
|
监控 关系型数据库 MySQL
Aurora MySQL负载突增应对策略与优化方案
通过以上策略,企业可以有效应对 Aurora MySQL 的负载突增,确保数据库在高负载情况下依然保持高性能和稳定性。这些优化方案涵盖了从架构设计到具体配置和监控的各个方面,能够全面提升数据库的响应速度和处理能力。在实际应用中,应根据具体的业务需求和负载特征,灵活调整和应用这些优化策略。
187 22
|
10月前
|
存储 运维 数据挖掘
|
12月前
|
前端开发 持续交付 开发工具
理解前端开发中的 Git - Rebase
Git Rebase 是前端开发中常用的一种版本控制操作,用于将一个分支的更改整合到另一个分支。与合并(Merge)不同,Rebase 可以使提交历史更加线性整洁,有助于保持代码库的清晰和可维护性。通过 Rebase,开发者可以将特性分支的改动应用到主分支上,同时保留或重写提交记录。
|
监控 Java Docker
Spring Boot与OpenShift的集成
Spring Boot与OpenShift的集成