什麼是狀態模式
狀態模式允許對象在內部狀態改變時改變它的行爲,對象看起來好像修改了它的類。
1. 這個模式將狀態封裝成爲獨立的類,並將動作委託到代表當前狀態的對象,我們知道行爲會隨着內部狀態而改變。
2. 使用組合通過簡單因爲不同的狀態對象來造成類改變的假象。
/*
* IState.h
*
* Created on: Jul 4, 2017
* Author: gwwu
*/
#ifndef ISTATE_H_
#define ISTATE_H_
class Context;
class IState {
public:
IState() {m_pContext = NULL;};
virtual ~IState() {};
virtual void Handler() = 0;
protected:
Context *m_pContext;
};
#endif /* ISTATE_H_ */
/*
* ConcreteStateA.h
*
* Created on: Jul 4, 2017
* Author: gwwu
*/
#ifndef CONCRETESTATEA_H_
#define CONCRETESTATEA_H_
#include "IState.h"
class ConcreteStateA : public IState
{
public:
ConcreteStateA(Context *context);
~ConcreteStateA(void);
void Handler();
};
#endif /* CONCRETESTATEA_H_ */
/*
* ConcreteStateA.cpp
*
* Created on: Jul 4, 2017
* Author: gwwu
*/
#include <iostream>
#include "Context.h"
#include "ConcreteStateA.h"
#include "ConcreteStateB.h"
using namespace std;
ConcreteStateA::ConcreteStateA(Context * context)
{
m_pContext = context;
}
ConcreteStateA::~ConcreteStateA()
{
}
void ConcreteStateA::Handler()
{
cout << "current state is A" << endl;
m_pContext->SetState(Context::pConcreteStateB);
}
/*
* ConcreteStateB.h
*
* Created on: Jul 4, 2017
* Author: gwwu
*/
#ifndef CONCRETESTATEB_H_
#define CONCRETESTATEB_H_
#include "IState.h"
class ConcreteStateB : public IState
{
public:
ConcreteStateB(Context *context);
~ConcreteStateB(void);
void Handler();
};
#endif
/*
* ConcreteStateB.cpp
*
* Created on: Jul 4, 2017
* Author: gwwu
*/
#include <iostream>
#include "ConcreteStateA.h"
#include "ConcreteStateB.h"
#include "Context.h"
using namespace std;
ConcreteStateB::ConcreteStateB(Context *context)
{
m_pContext = context;
}
ConcreteStateB::~ConcreteStateB()
{
}
void ConcreteStateB::Handler()
{
cout << "current state is B" << endl;
m_pContext->SetState(Context::pConcreteStateA);
}
/*
* Context.h
*
* Created on: Jul 4, 2017
* Author: gwwu
*/
#ifndef CONTEXT_H_
#define CONTEXT_H_
#include "IState.h"
#include "ConcreteStateA.h"
#include "ConcreteStateB.h"
class Context {
public:
Context();
Context(IState *state);
~Context();
static ConcreteStateA *pConcreteStateA;
static ConcreteStateB *pConcreteStateB;
void SetState(IState *state);
void Handler();
private:
IState *m_pstate;
};
#endif /* CONTEXT_H_ */
/*
* Context.cpp
*
* Created on: Jul 4, 2017
* Author: gwwu
*/
#include <iostream>
#include "Context.h"
using namespace std;
Context::Context(IState *state)
{
m_pstate = state;
pConcreteStateA = new ConcreteStateA(this);
pConcreteStateB = new ConcreteStateB(this);
}
ConcreteStateA* Context::pConcreteStateA = NULL;
ConcreteStateB* Context::pConcreteStateB = NULL;
Context::Context()
{
m_pstate = NULL;
pConcreteStateA = new ConcreteStateA(this);
pConcreteStateB = new ConcreteStateB(this);
}
Context::~Context()
{
delete pConcreteStateA;
pConcreteStateA = NULL;
delete pConcreteStateB;
pConcreteStateB = NULL;
}
void Context::SetState(IState *state)
{
m_pstate = state;
}
void Context::Handler()
{
m_pstate->Handler();
}
int main(int argc, char *argv[])
{
Context context;
context.SetState(Context::pConcreteStateA);
context.Handler();
context.Handler();
context.Handler();
context.Handler();
return 0;
}
編譯運行: