- 浏览: 761453 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.
主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化.
要点:
1.状态模式允许一个对象基于内部状态而拥有不同的行为
2.和程序状态机(PSM)不同,状态模式用类代表状态
3.Context会将行为委托给当前状态对象
4.通过将每个状态封装进一个类,我们把以后需要做的任何改变局部化了
5.状态模式和策略模式有相同的类图,但它们的意图不同
6.策略模式通常会用行为或算法来配置Context类
7.状态模式允许Context随着状态的改变而改变行为
8.状态转换可以由State类或Context类控制
9.使用状态模式通常会导致设计中类的数目大量增加//确实如此...
10.状态类可以被多个Context实例共享
由于2个类的相互引用,导致很多类都要写进cpp,代码虽然比较多,但逻辑并不复杂
GameState.h
AddCoinsState.h
AddCoinsState.cpp
PlayGameState.h
PlayGameState.cpp
BadGameState.h
BadGameState.cpp
GoodGameState.h
GoodGameState.cpp
GameOverState.h
GameOverState.cpp
GameMachine.h
GameMachine.cpp
main.cpp
add 5 coins
add a coins:7//投一个币加2次机会
a bad game,coin-1:6
a good game,coin+1:7
a bad game,coin-1:6
a bad game,coin-1:5
a bad game,coin-1:4
a bad game,coin-1:3
a bad game,coin-1:2
a bad game,coin-1:1
a bad game,coin-1:0
game over!
一份关于rtsp的实现
主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化.
要点:
1.状态模式允许一个对象基于内部状态而拥有不同的行为
2.和程序状态机(PSM)不同,状态模式用类代表状态
3.Context会将行为委托给当前状态对象
4.通过将每个状态封装进一个类,我们把以后需要做的任何改变局部化了
5.状态模式和策略模式有相同的类图,但它们的意图不同
6.策略模式通常会用行为或算法来配置Context类
7.状态模式允许Context随着状态的改变而改变行为
8.状态转换可以由State类或Context类控制
9.使用状态模式通常会导致设计中类的数目大量增加//确实如此...
10.状态类可以被多个Context实例共享
由于2个类的相互引用,导致很多类都要写进cpp,代码虽然比较多,但逻辑并不复杂
GameState.h
#ifndef GAMESTATE_H #define GAMESTATE_H enum State{ ADDCOINS, PLAYGAME, BADGAME, GOODGAME, GAMEOVER }; class GameState{ public: virtual void addCoins()=0; virtual void playGame()=0; virtual void badGame()=0; virtual void goodGame()=0; virtual void gameOver()=0; }; #endif // GAMESTATE_H
AddCoinsState.h
#ifndef ADDCOINSSTATE_H #define ADDCOINSSTATE_H #include "GameState.h" #include "GameMachine.h" #include <iostream> using namespace std; class GameMachine; class AddCoinsState:public GameState{ private: GameMachine* mMachine; public: AddCoinsState(GameMachine* machine); void addCoins(); void playGame(); void badGame(); void goodGame(); void gameOver(); }; #endif // ADDCOINSSTATE_H
AddCoinsState.cpp
#include "AddCoinsState.h" AddCoinsState::AddCoinsState(GameMachine *machine){ mMachine = machine; } void AddCoinsState::addCoins(){ mMachine->setCount(mMachine->getCount()+2); cout << "add a coin" << endl; mMachine->setState(mMachine->getPlayGameState()); } void AddCoinsState::playGame(){ cout << "please add a coin" << endl; } void AddCoinsState::badGame(){ cout << "no coin" << endl; } void AddCoinsState::goodGame(){ cout << "no coin" << endl; } void AddCoinsState::gameOver(){ cout << "no coin" << endl; }
PlayGameState.h
#ifndef PLAYGAMESTATE_H #define PLAYGAMESTATE_H #include "GameState.h" #include "GameMachine.h" class GameMachine; class PlayGameState:public GameState{ private: GameMachine* mMachine; bool mFlag; public: PlayGameState(GameMachine* machine); void addCoins(); void playGame(); void badGame(); void goodGame(); void gameOver(); }; #endif // PLAYGAMESTATE_H
PlayGameState.cpp
#include "PlayGameState.h" #include <stdlib.h> PlayGameState::PlayGameState(GameMachine *machine){ mMachine = machine; mFlag = false; } void PlayGameState::addCoins(){ mMachine->setCount(mMachine->getCount()+2); } void PlayGameState::playGame(){ srand(time(0)); while(mMachine->getCount()>0){ if(not mFlag){ int game = rand()%10+1;//1-10 if(game>=8){ mFlag = true;//只给一次good game的机会 mMachine->setState(mMachine->getGoodGameState()); mMachine->goodGame(); } } mMachine->setState(mMachine->getBadGameState()); mMachine->badGame(); } mMachine->setState(mMachine->getGameOverState()); mMachine->gameOver(); } void PlayGameState::badGame(){ cout << "playing" << endl; } void PlayGameState::goodGame(){ cout << "playing" << endl; } void PlayGameState::gameOver(){ cout << "playing" << endl; }
BadGameState.h
#ifndef BADGAMESTATE_H #define BADGAMESTATE_H #include "GameState.h" #include "GameMachine.h" class GameMachine; class BadGameState:public GameState{ private: GameMachine* mMachine; public: BadGameState(GameMachine* machine); void addCoins(); void playGame(); void badGame(); void goodGame(); void gameOver(); }; #endif // BADGAMESTATE_H
BadGameState.cpp
#include "BadGameState.h" BadGameState::BadGameState(GameMachine *machine){ mMachine = machine; } void BadGameState::addCoins(){ mMachine->setCount(mMachine->getCount()+2); } void BadGameState::playGame(){ badGame(); } void BadGameState::badGame(){ mMachine->setState(mMachine->getPlayGameState()); mMachine->setCount(mMachine->getCount()-1); cout << "a bad game,coin-1:" << mMachine->getCount() << endl; } void BadGameState::goodGame(){ badGame(); } void BadGameState::gameOver(){ badGame(); }
GoodGameState.h
#ifndef GOODGAMESTATE_H #define GOODGAMESTATE_H #include "GameState.h" #include "GameMachine.h" class GameMachine; class GoodGameState:public GameState{ private: GameMachine* mMachine; public: GoodGameState(GameMachine* machine); void addCoins(); void playGame(); void badGame(); void goodGame(); void gameOver(); }; #endif // GOODGAMESTATE_H
GoodGameState.cpp
#include "GoodGameState.h" GoodGameState::GoodGameState(GameMachine *machine){ mMachine = machine; } void GoodGameState::addCoins(){ mMachine->setCount(mMachine->getCount()+2); } void GoodGameState::playGame(){ goodGame(); } void GoodGameState::badGame(){ goodGame(); } void GoodGameState::goodGame(){ mMachine->setState(mMachine->getPlayGameState()); mMachine->setCount(mMachine->getCount()+1); cout << "a good game,coin+1:" << mMachine->getCount() << endl; } void GoodGameState::gameOver(){ goodGame(); }
GameOverState.h
#ifndef GAMEOVERSTATE_H #define GAMEOVERSTATE_H #include "GameState.h" #include "GameMachine.h" class GameMachine; class GameOverState:public GameState{ private: GameMachine* mMachine; public: GameOverState(GameMachine* machine); void addCoins(); void playGame(); void badGame(); void goodGame(); void gameOver(); }; #endif // GAMEOVERSTATE_H
GameOverState.cpp
#include"GameOverState.h" GameOverState::GameOverState(GameMachine* machine){ mMachine = machine; } void GameOverState::addCoins(){ mMachine->setCount(mMachine->getCount()+2); } void GameOverState::playGame(){ gameOver(); } void GameOverState::badGame(){ gameOver(); } void GameOverState::goodGame(){ gameOver(); } void GameOverState::gameOver(){ cout << "game over!" << endl; }
GameMachine.h
#ifndef GAMEMACHINE_H #define GAMEMACHINE_H #include "GameState.h" #include "AddCoinsState.h" #include "PlayGameState.h" #include "BadGameState.h" #include "GoodGameState.h" #include "GameOverState.h" #include <assert.h> #include <iostream> using namespace std; class GameMachine{ private: State mState; int mCount; GameState* addCoinsState; GameState* playGameState; GameState* badGameState; GameState* goodGameState; GameState* gameOverState; GameState* gameState;//default public: GameMachine(int count); void addCoins(){ gameState->addCoins(); cout << "add a coins:" << mCount << endl; } void playGame(){ gameState->playGame(); } void badGame(){ gameState->badGame(); } void goodGame(){ gameState->goodGame(); } void gameOver(){ gameState->gameOver(); } void setState(GameState* state){ gameState = state; } int getCount()const{ return mCount; } void setCount(int count){ mCount = count; } GameState* getAddCoinsState(){ return addCoinsState; } GameState* getPlayGameState(){ return playGameState; } GameState* getBadGameState(){ return badGameState; } GameState* getGoodGameState(){ return goodGameState; } GameState* getGameOverState(){ return gameOverState; } }; #endif // GAMEMACHINE_H
GameMachine.cpp
#include "GameMachine.h" GameMachine::GameMachine(int count){ assert(count>=0); cout << "add " << count << " coins" << endl; mCount = count; addCoinsState = new AddCoinsState(this); playGameState = new PlayGameState(this); badGameState = new BadGameState(this); goodGameState = new GoodGameState(this); gameOverState = new GameOverState(this); if(count>0){ mState = PLAYGAME; gameState = new PlayGameState(this); }else{ mState = GAMEOVER; gameState = new GameOverState(this); } }
main.cpp
#include "GameMachine.h" int main(){ GameMachine *machine = new GameMachine(5); machine->addCoins(); machine->playGame(); }
add 5 coins
add a coins:7//投一个币加2次机会
a bad game,coin-1:6
a good game,coin+1:7
a bad game,coin-1:6
a bad game,coin-1:5
a bad game,coin-1:4
a bad game,coin-1:3
a bad game,coin-1:2
a bad game,coin-1:1
a bad game,coin-1:0
game over!
一份关于rtsp的实现
#include <iostream> using namespace std; class RTSPState { public: RTSPState(){} virtual ~RTSPState(){} virtual bool processDescribe() { cout << "无法处理describe" << endl; return false; } virtual bool processSetup() { cout << "无法处理setup" << endl; return false; } virtual bool processPlay() { cout << "无法处理play" << endl; return false; } virtual bool processTeardown() { cout << "无法处理teardown" << endl; return false; } }; class DescribeState:public RTSPState { public: bool processSetup() { cout << "处理setup" << endl; return true; } }; class SetupState:public RTSPState { public: bool processPlay() { cout << "处理play" << endl; return true; } }; class PlayState:public RTSPState { public: bool processTeardown() { cout << "处理teardown" << endl; return true; } }; class TeardownState:public RTSPState { public: bool processDescribe() { cout << "处理describe" << endl; return true; } }; class RTSPLink { public: RTSPLink() { mDescribeState = new DescribeState; mSetupState = new SetupState; mPlayState = new PlayState; mTeardownState = new TeardownState; mRtspState = mTeardownState; } ~RTSPLink() { mRtspState = NULL; if(mDescribeState!=NULL) { delete mDescribeState; mDescribeState = NULL; } if(mSetupState!=NULL) { delete mSetupState; mSetupState = NULL; } if(mPlayState!=NULL) { delete mPlayState; mPlayState = NULL; } if(mTeardownState!=NULL) { delete mTeardownState; mTeardownState = NULL; } } void setState(RTSPState* rtspState) { mRtspState= rtspState; } RTSPState* getDescribeState() { return mDescribeState; } RTSPState* getSetupState() { return mSetupState; } RTSPState* getPlayState() { return mPlayState; } RTSPState* getTeardownState() { return mTeardownState; } bool processDescribe() { if(mRtspState->processDescribe()) { setState(mDescribeState); return true; } setState(mTeardownState); return false; } bool processSetup() { if(mRtspState->processSetup()) { setState(mSetupState); return true; } setState(mTeardownState); return false; } bool processPlay() { if(mRtspState->processPlay()) { setState(mPlayState); return true; } setState(mTeardownState); return false; } bool processTeardown() { if(mRtspState->processTeardown()) { setState(mTeardownState); return true; } setState(mTeardownState); return false; } private: RTSPState *mDescribeState; RTSPState *mSetupState; RTSPState *mPlayState; RTSPState *mTeardownState; RTSPState *mRtspState; }; int main() { RTSPLink * rtspLink = new RTSPLink; rtspLink->processDescribe(); rtspLink->processSetup(); rtspLink->processPlay(); rtspLink->processTeardown(); cout << "设置playstate" << endl; rtspLink->setState(rtspLink->getPlayState()); rtspLink->processDescribe(); } 处理describe 处理setup 处理play 处理teardown 设置playstate 无法处理describe
发表评论
-
桥接模式(Bridge)
2014-09-26 15:34 813桥接模式:将抽象与实现解耦,使得两者可以独立地变化,抽象部分的 ... -
访问者模式(Visitor)
2014-08-03 13:59 830访问者模式(Visitor),表示一个作用于某对象结构中的各元 ... -
解释器模式(interpreter)
2014-08-03 13:55 673解释器模式(interpreter),给定一个语言,定义它的方 ... -
享元模式(Flyweight)
2014-08-02 09:31 632享元模式(Flyweight):运用共享技术有效地支持大量细粒 ... -
中介者模式(Mediator)
2014-08-02 09:26 441中介者模式(Mediator):用一个中介对象来封装一系列的对 ... -
职责链模式(Responsibility)
2014-07-31 20:36 581职责链模式(Chain of Responsibility): ... -
合成/聚合利用原则
2014-07-29 20:56 585合成/聚合利用原则:尽量使用合成/聚合,尽量不要使用类继承 ... -
组合模式(Composite)
2014-07-27 10:15 430组合模式(Composite):将对象组合成树形结构以表示'部 ... -
备忘录模式(Memento)
2014-07-26 09:09 558备忘录(Memento):在不破坏封装性的前提下,捕获一个对象 ... -
事件委托(delegate)
2014-07-23 20:53 592委托机制的本质就是调用成员函数的函数指针,实现回调 委托就是 ... -
建造者模式(Builder)
2014-07-23 20:45 561建造者模式(Builder):将一个复杂对象的构建与它的表示分 ... -
外观模式(facade)
2014-07-20 09:31 623外观模式(facade):为子系统中的一组接口提供一个一致的界 ... -
迪米特法则
2014-07-19 18:23 403迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应当发 ... -
原型模式
2014-07-16 20:34 508原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创 ... -
里氏代换
2014-07-12 09:43 333里氏代换:一个软件实体如果使用的是一个父类的话,那么一定适用于 ... -
依赖倒转
2014-07-12 09:39 390依赖倒转:抽象不应该依赖细节,细节应该依赖抽象,说白了就是针对 ... -
开放-封闭原则
2014-07-12 09:33 557开放-封闭原则:是说软件实体(类,模块,函数等等)应该可以扩展 ... -
单一职责
2014-07-12 09:26 554单一职责原则(SRP),就一个类而言,应该仅有一个引起它变化的 ... -
MVC
2011-07-21 17:32 1008MVC是一种复合模式,结合了观察者,策略模式和组合模式。 要 ... -
代理模式(Proxy)
2011-07-19 15:47 921代理模式:为另一个对象提供一个替身或占位符以控制这个对象的访问 ...
相关推荐
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
Unity3d 3D模型描边代码 懒人直接上代码
原文链接:https://alading.blog.csdn.net/article/details/141710476 包含功能: 经理管理:负责经理信息维护与权限分配,确保管理层操作的安全性和高效性。 员工管理:管理员工信息,包括招聘、离职、考勤及权限设置,优化人力资源配置。 商品分类管理:对商品进行科学分类,便于商品检索与管理,提升顾客购物体验。 商品信息管理:维护商品详细信息,如名称、价格、描述等,确保信息准确无误。 商品入库管理:监控商品入库流程,记录库存变化,实现库存精准管理。 商品销售管理:处理销售事务,包括销售记录、退货处理,支持销售业绩分析。 缺货提醒管理:自动检测库存水平,及时发出缺货警告,保障商品供应连续性。 商品收银管理:处理交易结算,支持多种支付方式,确保收银过程快速准确。 供应商管理:维护供应商信息,评估合作效果,优化供应链,保证商品质量与供应稳定性。
MATLAB实现工业PCB电路板缺陷识别和检测【图像处理实战】项目详情请参见:https://handsome-man.blog.csdn.net/article/details/130493170 PCB板检测的大概流程如下:首先存储一个标准PCB板图像作为良好板材的参考标准,然后将待检测的PCB板图像进行处理,比较与标准PCB图像的差异,根据差异的情况来判断缺陷类型。 项目代码可顺利编译运行~
Jupyter-Notebook
1991-2021年中国科技统计年鉴-最新数据发布.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
BMI270 驱动开发程序
Jupyter-Notebook
Jupyter-Notebook
Jupyter-Notebook
上市公司基本资料及行业分类(2020)+员工构成数据大全(2006-2020)-最新发布.zip
安慰剂检验代码与数据文章-最新研究成果.zip
原文链接:https://alading.blog.csdn.net/article/details/141678636 包含功能: 用户管理:负责系统用户的注册、登录、权限分配及个人信息管理。 供应商管理:维护供应商信息,包括添加、编辑、删除供应商资料及合作状态。 商品分类管理:创建、修改和删除商品分类,便于商品归类与查找。 商品信息管理:管理商品详情,如添加新品、编辑商品属性、价格及库存量。 采购入库管理:记录采购订单详情,处理入库操作,更新库存数量。 销售信息管理:记录销售订单,追踪销售数据,支持销售分析与报表生成。 赠品入库管理:管理赠品入库流程,记录赠品信息,关联促销活动。 退货入库管理:处理客户退货,记录退货详情,恢复库存数量。 其他入库管理:管理非采购、非赠品的入库情况,如调拨入库等。 购买订单管理:跟踪客户购买订单状态,从下单到发货的全流程管理。 赠送信息管理:管理赠品发放规则,记录赠送活动执行情况。 盘点信息管理:定期进行库存盘点,记录盘点结果,调整库存差异。
演示:https://blog.csdn.net/m0_54925305/article/details/143660348?spm=1001.2014.3001.5501
Jupyter-Notebook
shiahdifhiahfiqefiwhfi weifwijfiwqufiqweefijeq0jfe
用java实现了全部23种设计模式,代码简单易懂,注释详细,仅作学习使用——hrh。
北大新农研究院联合阿里县域乡村指数(2018)-已更至最新.zip