设计模式——状态模式(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
- 设计模式——状态模式(c++)
- 设计模式——状态模式(C++)
- 设计模式—状态模式(十二)
- 设计模式—状态模式
- 设计模式—状态模式
- 设计模式之状态模式(c++)
- 设计模式(状态变化)——状态模式
- 设计模式——状态设计模式
- 设计模式——状态模式(State)
- 设计模式——状态模式
- java设计模式——状态模式
- PHP设计模式——状态模式
- 设计模式之——状态模式
- 设计模式之——状态模式
- 设计模式(19)——状态模式
- 设计模式——状态模式
- C++设计模式——状态模式
- 设计模式——状态模式
- LA2678 Subsequence 时间优化
- Cpp环境【NOIP2010提高组】【Vijos1777】【Code[VS]1066】【CQYZOJ1793】引水入城
- 如何在onitemclick获取ListView的item
- Windows下MySQL远程连接数据库(Workbench版本)
- 【NOIP2010提高组】引水入城
- 设计模式——状态模式(C++)
- 某个服务的调用顺序
- UVAlive 6525 二分图匹配
- miniblink渲染架构重整
- 七天学会ASP.NET MVC (五)——Layout页面使用和用户角色管理
- CodeForces 474EPillars(线断树区间最大)
- 300. Longest Increasing Subsequence
- RC522读卡器 M1卡学习总结(二)
- NOIP2015普及组 金币