设计模式(4)--对象行为(8)--状态

1. 意图

    允许一个对象在其内部状态改变时改变它的行为。

2. 三种角色

    上下文环境(Context)、抽象状态(State)、具体状态(Concrete State)

3. 优点

    3.1 将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。

    3.2 使得状态转换显式化。

    3.3 State对象可被共享。

4. 缺点

    4.1 增加了子类的数目

5. 相关模式

    5.1 状态对象通常用享元模式实现

    5.2 状态对象通常是单件

6. 代码示意(C++)
#pragma once
#include <iostream>
using namespace std;

class Context;

class State
{
public:
	virtual void Handle(Context* pContext) = 0;
protected:
	State() {}
	void ChangeState(Context* pContext, State* pState);
};

class ConcreteStateA :public State
{
	static ConcreteStateA* s_instance;
public:
	static State* Instance() {
		if (0 == s_instance) {
			s_instance = new ConcreteStateA;
		}
		return s_instance;
	}
	static void DelInstance() {
		delete s_instance;
	}
public:
	virtual void Handle(Context* pContext);
protected:
	ConcreteStateA() {}
};

class ConcreteStateB :public State
{
	static ConcreteStateB* s_instance;
public:
	static State* Instance() {
		if (0 == s_instance) {
			s_instance = new ConcreteStateB;
		}
		return s_instance;
	}
	static void DelInstance() {
		delete s_instance;
	}
public:
	virtual void Handle(Context* pContext);
protected:
	ConcreteStateB() {}
};

class Context
{
	State* m_pState;
public:
	Context() {
		m_pState = ConcreteStateA::Instance();
	}
	void Request() {
		if (0 != m_pState) {
			m_pState->Handle(this);
		}
	}
private:
	friend class State;
	void ChangeState(State* pState) {
		m_pState = pState;
	}
};

State.cpp:

#include "State.h"

ConcreteStateA* ConcreteStateA::s_instance = 0;
ConcreteStateB* ConcreteStateB::s_instance = 0;

void State::ChangeState(Context* pContext, State* pState) {
	pContext->ChangeState(pState);
}

void ConcreteStateA::Handle(Context* pContext) {
	cout << "ConcreteStateA handled" << endl;
	ChangeState(pContext, ConcreteStateB::Instance());
}

void ConcreteStateB::Handle(Context* pContext) {
	cout << "ConcreteStateB handled" << endl;
}
#include "State.h"
int main() {

	Context* pContext = new Context();
	pContext->Request();
	pContext->Request();

	delete pContext;

	return 0;
}

运行结果:

  6.1 不同的ConcreteState,对应不同的处理方法(3.1)

  6.2 状态对象比多个一般变量更明确,更容易理解和管理(3.2)

  6.3 代码里的状态对象是单例共享的(3.3)

  6.4 一个ConcreteState需要知道下一个状态是谁。

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2023-12-29 12:08:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-29 12:08:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-29 12:08:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-29 12:08:02       20 阅读

热门阅读

  1. 相比于其他流处理技术,Flink的优点在哪?

    2023-12-29 12:08:02       32 阅读
  2. Linux实现ssh公钥登录的步骤

    2023-12-29 12:08:02       39 阅读
  3. linux firewalld简介

    2023-12-29 12:08:02       38 阅读
  4. 面试经典150题(55-58)

    2023-12-29 12:08:02       38 阅读
  5. 【数据库】PostgreSQL中的DISTINCT ON和DISTINCT的区别

    2023-12-29 12:08:02       36 阅读
  6. MD5算法

    MD5算法

    2023-12-29 12:08:02      37 阅读
  7. 编程语言的未来?

    2023-12-29 12:08:02       32 阅读
  8. SpringBoot 中实现订单30分钟自动取消的策略

    2023-12-29 12:08:02       35 阅读
  9. Redis使用中的常见问题及解决方案

    2023-12-29 12:08:02       43 阅读
  10. 湘潭大学软件工程头歌多选题-期末考试复习资料

    2023-12-29 12:08:02       33 阅读