首页 > 代码库 > State Design Pattern 状态设计模式
State Design Pattern 状态设计模式
设置好内部状态,然后根据不同的函数作为行为模式,进行状态转换。
有点像Finite Automata算法,两者的思想是一样的。
会Finite Automata,那么这个设计模式就很容易了。
#pragma once #include <stdlib.h> #include <math.h> #include <random> #include <time.h> enum STATES { FULLY_RENTED, WAITING, GOT_APPLICATION, APARTMENT_RENTED }; class RentalMethods { STATES state; int numberOfAppartments; public: RentalMethods(int n):state(WAITING), numberOfAppartments(n) { srand((unsigned)time(NULL)); } void getApplication() { switch (state) { case FULLY_RENTED: puts("Sorry, we are fully rented."); break; case WAITING: state = GOT_APPLICATION; puts("Thanks for the application."); break; case GOT_APPLICATION: puts("We already got your application."); break; case APARTMENT_RENTED: puts("Hang on, we are renting you an apartment."); break; } } void checkApplication() { bool yesOrNo = rand() % 2; switch (state) { case FULLY_RENTED: puts("Sorry, we are fully rented."); break; case WAITING: puts("You have to submit an application."); break; case GOT_APPLICATION: { if (yesOrNo && numberOfAppartments > 0) { puts("Congratulations, you were approved."); state = APARTMENT_RENTED; rentApartment(); } else { puts("Sorry, you were not approved."); state = WAITING; } } break; case APARTMENT_RENTED: puts("Hang on, we are renting you an apartment."); break; } } void rentApartment() { switch (state) { case FULLY_RENTED: puts("Sorry, we are fully rented."); break; case WAITING: puts("You have to submit an application."); break; case GOT_APPLICATION: puts("You must have your application checked."); break; case APARTMENT_RENTED: puts("Renting you an apartment..."); numberOfAppartments--; dispenseKeys(); break; } } void dispenseKeys() { switch (state) { case FULLY_RENTED: puts("Sorry, we are fully rented."); break; case WAITING: puts("You have to submit an application."); break; case GOT_APPLICATION: puts("You must have your application checked."); break; case APARTMENT_RENTED: puts("Here are your key!"); state = WAITING; break; } } }; void States_Run() { RentalMethods rentalMethods(9); rentalMethods.getApplication(); rentalMethods.checkApplication(); }
运行有两种随机结果:
1
2
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。