设计模式——状态模式(C++)

来源:互联网 发布:java语言培训哪家好 编辑:程序博客网 时间:2024/05/16 09:42

参考:设计模式读书笔记-----状态模式

代码如下:

/*****************************************Copyright (c) 2016 Jingshuang Hu@filename:State.h@datetime:2016.09.19@author:HJS@e-mail:jingshuang_hu@163.com@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:jingshuang_hu@163.com@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:jingshuang_hu@163.com@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:jingshuang_hu@163.com@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:jingshuang_hu@163.com@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;}

1 0
原创粉丝点击