设计模式读书笔记:State(状态)

原创 2015年07月10日 21:27:54

意图:

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

结构图:来自 《23种设计模式 - 郗晓勇》


实现:https://github.com/panshiqu/patterns/tree/master/State

Context

namespace NS_STATE {

class State;
class Context {
public:
	Context(State *state) : _state(state) {}
	virtual ~Context() {}
	void request(void);

private:
	friend class State;
	void changeState(State *state);

private:
	State *_state;
};

} /* namespace NS_STATE */
#include "Context.h"
#include "State.h"

namespace NS_STATE {

void Context::request(void)
{
	_state->handle(this);
}

void Context::changeState(State *state)
{
	_state = state;
}

} /* namespace NS_STATE */

State

#include "Context.h"

namespace NS_STATE {

class State {
public:
	State() {}
	virtual ~State() {}
	virtual void handle(Context *context) = 0;

protected:
	void changeState(Context *context, State *state)
	{
		context->changeState(state);
	}
};

} /* namespace NS_STATE */

ConcreteStateA

#include "State.h"
#include "ConcreteStateB.h"
#include <iostream>

namespace NS_STATE {

class ConcreteStateA : public State
{
public:
	ConcreteStateA() {}
	virtual ~ConcreteStateA() {}
	virtual void handle(Context *context)
	{
		std::cout << "ConcreteStateA." << std::endl;
		changeState(context, ConcreteStateB::getInstance());
	}
};

} /* namespace NS_STATE */
ConcreteStateB

#include "State.h"
#include <iostream>

namespace NS_STATE {

class ConcreteStateB : public State
{
public:
	ConcreteStateB() {}
	virtual ~ConcreteStateB() {}
	static ConcreteStateB *getInstance(void)
	{
		static ConcreteStateB instance;
		return &instance;
	}
	virtual void handle(Context *context)
	{
		std::cout << "ConcreteStateB." << std::endl;
	}
};

} /* namespace NS_STATE */
main

#include "State/Context.h"
#include "State/ConcreteStateA.h"
#include "State/ConcreteStateB.h"
using namespace NS_STATE;
int main(void)
{
	ConcreteStateA csa;
	Context c(&csa);
	c.request();
	c.request();
}
附加:
版权声明:本文为博主原创文章,未经博主允许不得转载。

【设计模式】学习笔记14:状态模式(State)

认识状态模式 假设有一个糖果机, 它的工作状态图如下:要用代码实现糖果机的功能, 如果不用状态模式: 一种方法是创建一个类,它的作用就是一个状态机,对每一个动作,我们都创建了一个对应的方法,这些方法...
  • shuangde800
  • shuangde800
  • 2013年08月22日 00:15
  • 19623

Java设计模式——状态模式(STATE PATTERN)

场景一 描述:现在城市发展很快,百万级人口的城市一堆一堆的,那其中有两个东西的发明在城市的发展中起到非常重要的作用:一个是汽车,一个呢是...,猜猜看,是什么?是电梯!汽车让城市可以横向扩展,电梯让城...
  • u012401711
  • u012401711
  • 2016年09月26日 23:45
  • 2667

JAVA设计模式(18):行为型-状态模式(State)

“人有悲欢离合,月有阴晴圆缺”,包括人在内,很多事物都具有多种状态,而且在不同状态下会具有不同的行为,这些状态在特定条件下还将发生相互转换。就像水,它可以凝固成冰,也可以受热蒸发后变成水蒸汽,水可以流...
  • taozi8023
  • taozi8023
  • 2016年05月19日 20:26
  • 6357

读书笔记_java设计模式深入研究 第八章 状态模式 State

1,状态模式:事务有n个状态,且维护状态变化。 2,UML模型:  -1,上下文环境Context:定义客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关...
  • fuli_mouren
  • fuli_mouren
  • 2014年12月29日 10:21
  • 515

《Android源码设计模式解析与实战》读书笔记(八)——状态模式

这两章都比较简单,就不多说废话,直入主题。 第八章 随遇而安——状态模式 顾名思义,状态模式,肯定跟状态有关系,它是根据状态来决定行为的,即不同状态有不同行为。听起来就跟策略模式很像,不错,都说状...
  • zgcqflqinhao
  • zgcqflqinhao
  • 2017年05月12日 10:55
  • 271

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

转载:http://blog.csdn.net/chenssy/article/details/11096391#comments 如侵犯你的权利,请告知,会及时删除。 在介绍...
  • darkbus111
  • darkbus111
  • 2017年05月31日 10:37
  • 215

HeadFirst设计模式_读书笔记_010_状态模式

状态模式:允许对象在内部状态改变的时候改变它的行为。   例如: 我们在12306上买票,行为是卖票,状态有两个,有余票则出票成功,余票不足就出票失败。 public class Stati...
  • youran02100210
  • youran02100210
  • 2017年04月11日 10:25
  • 124

大话设计模式读书笔记(十三) 状态模式

状态模式: 状态模式定义: 状态模式(State):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像改变了其子类。 状态模式UMl类图: 状态模式Java代码实现 public cla...
  • xsyfl
  • xsyfl
  • 2017年04月17日 19:48
  • 143

HeadFirst设计模式读书笔记

  • 2008年05月16日 17:20
  • 50KB
  • 下载

设计模式C++学习笔记之十九(State状态模式)

设计模式C++学习笔记之十九(State状态模式) 19.1.解释 概念:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 main(),客户 CLiftState...
  • DSIslander
  • DSIslander
  • 2012年11月23日 11:45
  • 296
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式读书笔记:State(状态)
举报原因:
原因补充:

(最多只允许输入30个字)