設計模式——狀態模式(C++)

參考:設計模式讀書筆記-----狀態模式

代碼如下:

/*****************************************
Copyright (c) 2016 Jingshuang Hu

@filename:State.h
@datetime:2016.09.19
@author:HJS
@e-mail:[email protected]
@blog:http://blog.csdn.net/hujingshuang
*****************************************/
#ifndef _STATE_H
#define _STATE_H

#include "Context.h"

class Context;

class State {
public:
    virtual void book() = 0;                // 預定
    virtual void unbook() = 0;              // 取消預定
    virtual void checkin() = 0;             // 入住
    virtual void checkout() = 0;            // 退房
};

// 已入住狀態
class  Checked: public State {
private:
    Context* room;
public:
    Checked(Context* room);
    virtual void book();
    virtual void unbook();
    virtual void checkin();
    virtual void checkout();
};

// 空閒狀態
class Free : public State {
private:
    Context* room;
public:
    Free(Context* room);
    virtual void book();
    virtual void unbook();
    virtual void checkin();
    virtual void checkout();
};

// 已預定狀態
class Booked : public State {
private:
    Context* room;
public:
    Booked(Context* room);
    virtual void book();
    virtual void unbook();
    virtual void checkin();
    virtual void checkout();
};

#endif // _STATE_H
/*****************************************
Copyright (c) 2016 Jingshuang Hu

@filename:State.cpp
@datetime:2016.09.19
@author:HJS
@e-mail:[email protected]
@blog:http://blog.csdn.net/hujingshuang
*****************************************/
#include "State.h"

#include <iostream>

using namespace std;

// 抽象狀態
void State::book() {}
void State::unbook() {}
void State::checkin() {}
void State::checkout() {}

// 空閒狀態:可預訂、可入住,不能退房、取消預定
Free::Free(Context* room) {
    this->room = room;
}

void Free::book() {
    room->setState(room->getBookState());                 // 變成已預訂狀態
    cout << "預定成功." << endl;
}

void Free::checkin() {
    room->setState(room->getCheckState());                // 變成已入住狀態
    cout << "入住成功." << endl;
}

void Free::unbook() {
    cout << "不能取消預定,您尚未預定該房間." << endl;
}

void Free::checkout() {
    cout << "不能退房,您尚未入住該房間." << endl;
}

// 已入住狀態:可退房,不能預定、取消預定、入住
Checked::Checked(Context* room) {
    this->room = room;
}

void Checked::book() {
    cout << "不能預定,該房間已入住." << endl;
}
void Checked::unbook() {
    cout << "不能取消預定,該房間已入住." << endl;
}
void Checked::checkin() {
    cout << "不能入住,該房間已入住." << endl;
}
void Checked::checkout() {
    room->setState(room->getFreeState());                   // 變成空閒狀態
    cout << "退房成功." << endl;
}

// 已預訂狀態:可取消預定、入住,不能預定、退房
Booked::Booked(Context* room) {
    this->room = room;
}

void Booked::book(){
    cout << "不能預定,該房間已被預定." << endl;
}

void Booked::unbook() {
    room->setState(room->getFreeState());                   // 變成空閒狀態
    cout << "取消預定成功." << endl;
}

void Booked::checkin() {
    room->setState(room->getCheckState());                // 變成入住狀態
    cout << "入住成功" << endl;
}

void Booked::checkout() {
    cout << "不能退房,您尚未入住該房間." << endl;
}
/*****************************************
Copyright (c) 2016 Jingshuang Hu

@filename:Context.h
@datetime:2016.09.19
@author:HJS
@e-mail:[email protected]
@blog:http://blog.csdn.net/hujingshuang
*****************************************/
#ifndef _CONTEXT_H
#define _CONTEXT_H

#include "State.h"

class State;

class Context {
private:
    State* state;
    State* stateFree;
    State* stateBooked;
    State* stateChecked;
public:
    Context();
    void book();
    void unbook();
    void checkin();
    void checkout();
    void setState(State* state);
    State* getFreeState();
    State* getBookState();
    State* getCheckState();
};

#endif // _CONTEXT_H
/*****************************************
Copyright (c) 2016 Jingshuang Hu

@filename:Context.cpp
@datetime:2016.09.19
@author:HJS
@e-mail:[email protected]
@blog:http://blog.csdn.net/hujingshuang
*****************************************/
#include "Context.h"
#include <iostream>

using namespace std;

Context::Context() {
    stateFree = new Free(this);
    stateBooked = new Booked(this);
    stateChecked = new Checked(this);
    state = stateFree;                              // 初始狀態
}

void Context::setState(State* state) {
    this->state = state;
}

State* Context::getFreeState() {
    return stateFree;
}

State* Context::getBookState() {
    return stateBooked;
}

State* Context::getCheckState() {
    return stateChecked;
}

void Context::book() {
    state->book();
}

void Context::unbook() {
    state->unbook();
}

void Context::checkin() {
    state->checkin();
}

void Context::checkout() {
    state->checkout();
}
/*****************************************
Copyright (c) 2016 Jingshuang Hu

@filename:main.cpp
@datetime:2016.09.19
@author:HJS
@e-mail:[email protected]
@blog:http://blog.csdn.net/hujingshuang
*****************************************/
#include <iostream>

#include "State.h"
#include "Context.h"

using namespace std;

// 狀態模式:允許對象在內部狀態改變時改變它的行爲,對象看起來好像是修改了它的類。

// 優點:
// 1 封裝了轉換原則;
// 2 枚舉了可能的狀態,在枚舉之前需要知道狀態的種類;
// 3 將所有狀態的行爲放到一個類中,方便增加新的狀態,改變對象的行爲即可改變對象的狀態;
// 4 捨棄了龐大的條件語句;
// 5 可以讓多個對象共享一個狀態對象,減少系統中對象的個數。

// 缺點:
// 1 對“開閉原則”支持不好;
// 2 狀態過多會導致系統中類的個數增加;

int main() {
    Context* room = new Context();      // 房間
    room->book();                       // 預定它
    room->book();
    room->checkin();
    room->unbook();
    room->checkout();

    system("pause");
    return 0;
}

發佈了117 篇原創文章 · 獲贊 391 · 訪問量 62萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章