设计模式(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 
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需要知道下一个状态是谁。

你可能感兴趣的:(设计模式,设计模式)