設計模式學習之------State模式(狀態模式)

什麼是狀態模式

狀態模式允許對象在內部狀態改變時改變它的行爲,對象看起來好像修改了它的類。
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;
}

編譯運行:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章