设计模式C++实现十二:状态模式

状态模式(state):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

状态模式主要解决的是当控制一个对象状态转换的条件表达式国语复杂时的情况。把状态的判断逻辑转移到不同状态的一系列类中,可以把复杂的判断逻辑简化。例如本文的例子,只要我们把时间输入,就可以根据时间判断使用哪个状态,而不用我们在客户端来判断,客户端看到的只是很简单的代码,我们把复杂的逻辑判断转移到后台,而后台可以判断每个状态的下一个状态。

状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。状态模式通过把各种状态转移逻辑分布到具体的状态类中,减少相互间的依赖。

使用场景:当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为,就可以考虑状态模式。

#ifndef STATE_H
#define STATE_H
#include<iostream>
#include<string>
using namespace std;
class Work;
class ForenoonState;
class NoonState;
class AfternoonState;
class EveningState;
class RestState;
class SleepingState;

class State
{
	friend class Work;
public:
	State(){}
	virtual void WriteProgram(Work *w){ }
};

class Work
{
	friend class ForenoonState;

public:
	//Work(){}
	State * current;
	double hour;
	bool finish = false;
	//(State * s):current(s) {}
	Work();
	//Work():current(new ForenoonState){}//此处会出现没有合适默认构造函数可用的错误提示,因为虽然我们在之前声明了ForenoonState类,但是没有给出定义,所以无法构造
	//但是可以在所有类声明完毕后实现这个默认构造函数。
	bool TaskFinished(){ return finish; }
	void SetState(State * s){ current = s; }
	void WriteProgram()
	{
		current->WriteProgram(this);
	}
};

class RestState :public State
{
public:
	RestState(){}
	void WriteProgram(Work* k)
	{
		cout << "当前时间: " << k->hour << "  下班回家了。\n";
	}

};
class SleepingState :public State
{
public:
	SleepingState(){}
	void WriteProgram(Work *k)
	{
		cout << "当前时间: " << k->hour << "  不行了,睡着了。\n";
	}
};
class EveningState :public State
{
public:
	EveningState(){}
	void WriteProgram(Work *k)
	{

		if (k->TaskFinished())
		{
			k->SetState(new RestState);
			k->WriteProgram();
		}

		else
		{
			if (k->hour < 21)
			{
				cout << "当前时间: " << k->hour << " 加班哦,疲累至极。\n";
			}

			else{ k->SetState(new SleepingState); k->WriteProgram(); }
		}
	}
};

class AfternoonState :public State
{
public:
	AfternoonState(){}
	void WriteProgram(Work *k)
	{

		if (k->hour<17)
			cout << "当前时间: " << k->hour << " 下午状态不错,继续努力\n";
		else
		{
			k->SetState(new EveningState); k->WriteProgram();
		}
	}

};
class NoonState :public State
{
public:
	NoonState(){}
	void WriteProgram(Work *k)
	{
		if (k->hour<13)
			cout << "当前时间: " << k->hour << " 饿了,午饭,犯困,午休\n";
		else
		{
			k->SetState(new AfternoonState); k->WriteProgram();
		}
	}
};
class ForenoonState :public State
{
	friend class Work;
public:
	ForenoonState(){}
	void WriteProgram(Work *k)
	{
		if (k->hour < 12)
			cout << "当前时间: " << k->hour << " 上午工作,精神百倍。\n";
		else
		{
			k->SetState(new NoonState); k->WriteProgram();
		}
	}
};

Work::Work() :current(new ForenoonState){}
#endif
#include"State.h"

int main()
{
	//State* start = new ForenoonState;
	//Work EmergencyProjects(start);
	Work EmergencyProjects;
	EmergencyProjects.hour = 9;
	EmergencyProjects.WriteProgram();
	EmergencyProjects.hour = 10;
	EmergencyProjects.WriteProgram();
	EmergencyProjects.hour = 12;
	EmergencyProjects.WriteProgram();
	EmergencyProjects.hour = 13;
	EmergencyProjects.WriteProgram();
	EmergencyProjects.hour = 14;
	EmergencyProjects.WriteProgram();
	EmergencyProjects.hour = 17;

	//EmergencyProjects.finish = false;
	EmergencyProjects.finish = true;//设置状态不同时,下面的代码执行将出现不同的响应。
	EmergencyProjects.WriteProgram();
	EmergencyProjects.hour = 19;
	EmergencyProjects.WriteProgram();
	EmergencyProjects.hour = 22;
	EmergencyProjects.WriteProgram();

	return 0;
}
时间: 2024-10-29 18:05:15

设计模式C++实现十二:状态模式的相关文章

javascript设计模式学习之十六——状态模式

状态模式的关键是区分事务内部和外部的状态,事务内部状态改变往往会带来事务的行为改变. 状态模式中有意思的一点是,一般我们谈到封装,都是优先封装对象的行为,而非对象的状态.但在状态模式中刚好相反,状态模式的关键是把事务的每种状态都封装为单独的类,跟此种状态有关的行为都封装在这个类的内部.与此同时,我们还可以把状态的切换规则实现分布在状态类中,这样就有效消除了原本存在的大量条件分支语句.

Java设计模式菜鸟系列(十二)组合模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39828653 组合模式(Composite):组合模式有时又叫部分-整体模式,将对象组合成树形结构来表示"部分-整体"层次结构.组合模式在处理树形结构的问题时比较方便. 一.uml建模: 二.代码实现 /** * 示例:组合模式有时也称"整合-部分"模式 * * 组合模式在处理树形结构的问题时比较方便 * * 节点 */ class TreeNode { /

C#设计模式之十二代理模式(Proxy Pattern)【结构型】

原文:C#设计模式之十二代理模式(Proxy Pattern)[结构型] 一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看."代理"可以理解为"代替",代替"主人"做一些事情,为什么需要"代理",是因为某些原因(比如:安全方面的原因),不想让"主人"直接

设计模式之第21章-状态模式(Java实现)

设计模式之第21章-状态模式(Java实现) “what are you 干啥了?怎么这么萎靡不振?”“昨晚又是补新番,又是补小笼包,睡得有点晚啊.话说杨过的那个雕兄真是太好了,每天给找蛇胆,又陪练武功的,想不无敌都难啊,还有那个blablabla”(作者已被拖走).咳咳,今天那个状态哥哥马不停蹄的赶过来,下面闪亮登场. 状态模式之自我介绍 今天不在状态,可能是由于宇宙差的原因,好了,先说下定义:Allow an object to alter its behavior when its int

设计模式十之状态模式1

状态模式,允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类. 这个模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象,我们知道行为会随着内部状态而改变.糖果机提供了一个很好地例子:当糖果机是在NoQuarterState或HasQuarterState两种不同的状态时,你投入25分钱,就会得到不同的行为(机器接受25分钱和机器拒绝25分钱). 如果说你使用的对象能够完全改变它的行为,那么会觉得,这个对象实际上是从别的类实例化而来的.然而,实际上,我们是在使用组合通过简单

【设计模式学习笔记】 之 状态模式

简介: 每种事物都有不同的状态,不同的状态会有不同的表现,通过更改状态从而改变表现的设计模式称为状态模式(state pattern) 下边会通过多个例子进行讲述,会有一些代码重用的类,请注意包名! 举例1: 人有多种心情,不同的心情会有不同的表现,这里先使用分支判断写个小例子 创建一个Person类,它持有一个表示心情的字符串,通过设置这个字符串并对这个字符串进行判断来决定产生不同的行为 1 package com.mi.state.state1; 2 3 /** 4 * 人类,拥有一个状态属

设计模式@第24章:状态模式

第24章:状态模式 一.APP 抽奖活动问题 请编写程序完成 APP 抽奖活动 具体要求如下: 假如每参加一次这个活动要扣除用户 50 积分,中奖概率是 10% 奖品数量固定,抽完就不能抽奖 活动有四个状态: 可以抽奖.不能抽奖.发放奖品和奖品领完 活动的四个状态转换关系图(右图) 二.状态模式基本介绍 基本介绍 状态模式(State Pattern):它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题.状态和行为是一一对应的,状态之间可以相互转换 当一个对象的内在状态改变时,允许

设计模式学习总结(二十二)--访问者模式

定义 访问者模式就是表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作.访问者模式适用于数据结构相对稳定的系统. 角色 Vistor: 抽象访问者.为该对象结构中的ConcreteElement的每一个类声明的一个操作. ConcreteVisitor: 具体访问者.实现Visitor申明的每一个操作,每一个操作实现算法的一部分. Element: 抽象元素.定义一个Accept操作,它以一个访问者为参数. ConcreteElement:

Java设计模式菜鸟系列(十九)备忘录模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/40018967 备忘录模式(Memento): 主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象. 一.uml建模: 二.代码实现 /** * 备忘录模式(Memento):主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象 * * 示例:原始类--> 创建.恢复备忘录 */ class Original { private String state; public Or