代碼如下:
/*****************************************
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;
}