设计模式(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();
}

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

目录
相关文章
|
设计模式 缓存 算法
JAVA设计模式14:策略模式,使算法的变化独立于使用它的客户端
JAVA设计模式14:策略模式,使算法的变化独立于使用它的客户端
107 0
|
6月前
|
设计模式 算法
交易链路设计原则&模式问题之中介者(Mediator)方法设计模式是什么,如何解决
交易链路设计原则&模式问题之中介者(Mediator)方法设计模式是什么,如何解决
|
8月前
|
设计模式 算法 C++
从 C++ 优化状态机实现:结合设计模式的实用指南
从 C++ 优化状态机实现:结合设计模式的实用指南
592 1
|
8月前
|
设计模式
二十三种设计模式全面解析-当你的对象需要知道其他对象的状态变化时,观察者模式是你的救星!
二十三种设计模式全面解析-当你的对象需要知道其他对象的状态变化时,观察者模式是你的救星!
|
8月前
|
设计模式
二十三种设计模式-解密状态模式:优雅地管理对象状态
二十三种设计模式-解密状态模式:优雅地管理对象状态
109 0
|
设计模式
设计模式中的六种关系以及代码之间的对应
设计模式中的六种关系以及代码之间的对应
174 0
设计模式中的六种关系以及代码之间的对应
|
设计模式 Java
状态切换:解析Java设计模式中的状态模式
在软件开发领域,设计模式是一组经过验证的最佳实践方法,用于解决各种常见问题。状态模式是一种行为型设计模式,其目标是将对象的不同状态抽象成不同的状态类,并允许对象在不同状态间进行切换。在本文中,我们将深入了解状态模式的核心思想、应用场景以及它在Java中的实际运用。
253 0
|
设计模式
状态设计模式解读
状态设计模式解读
|
存储 设计模式
【设计模式】【第四章】【订单状态流转】【状态模式 + 享元模式+模板方法模式】
【设计模式】【第四章】【订单状态流转】【状态模式 + 享元模式+模板方法模式】
138 0