網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
目錄
1、狀態(tài)模式概念
2、模塊職責(zé)
3、代碼實(shí)現(xiàn)
1、狀態(tài)模式概念
State模式也叫狀態(tài)模式,是行為設(shè)計(jì)模式的一種。State模式允許通過(guò)改變對(duì)象的內(nèi)部狀態(tài)而改變對(duì)象的行為,這個(gè)對(duì)象表現(xiàn)得就好像修改了它的類一樣。
狀態(tài)模式主要解決的是當(dāng)控制一個(gè)對(duì)象狀態(tài)轉(zhuǎn)換的條件表達(dá)式過(guò)于復(fù)雜時(shí)的情況。把狀態(tài)的判斷邏輯轉(zhuǎn)譯到表現(xiàn)不同狀態(tài)的一系列類當(dāng)中,可以把復(fù)雜的判斷邏輯簡(jiǎn)化。
2、模塊職責(zé)
Context:用戶對(duì)象
擁有一個(gè)State類型的成員,以標(biāo)識(shí)對(duì)象的當(dāng)前狀態(tài);
State:接口或基類
封裝與Context的特定狀態(tài)相關(guān)的行為;
ConcreteState:接口實(shí)現(xiàn)類或子類
實(shí)現(xiàn)了一個(gè)與Context某個(gè)狀態(tài)相關(guān)的行為。
適用于:對(duì)象的行為,依賴于它所處的當(dāng)前狀態(tài)。行為隨狀態(tài)改變而改變的場(chǎng)景。
適用于:通過(guò)用戶的狀態(tài)來(lái)改變對(duì)象的行為。
3、代碼實(shí)現(xiàn)
#include
using namespace std;
class Worker;
class State {
public:
virtual void doSomeThing(Worker *w) = 0;
};
class Worker {
public:
Worker();
int getHour()
{
return m_hour;
}
void setHour(int hour)
{
m_hour = hour;
}
State* getCurrentState()
{
return m_currstate;
}
void setCurrentState(State *state)
{
m_currstate = state;
}
void doSomeThing()
{
m_currstate->doSomeThing(this);
}
private:
int m_hour;
State *m_currstate;
};
class State1 : public State {
public:
void doSomeThing(Worker *w);
};
class State2 : public State {
public:
void doSomeThing(Worker *w);
};
void State1::doSomeThing(Worker *w) {
if(w->getHour() == 7 || w->getHour() == 8)
{
cout << "eat food!" <getCurrentState();
w->setCurrentState(new State2);
w->getCurrentState()->doSomeThing(w);
}
}
void State2::doSomeThing(Worker *w) {
if(w->getHour() == 9 || w->getHour() == 10)
{
cout << "working!" << endl;
}
else
{
delete w->getCurrentState();
w->setCurrentState(new State1);
cout << "currenttime:" << w->getHour() << endl;
}
}
Worker::Worker() {
m_currstate = new State1;
}
int main(){
Worker *w1 = new Worker;
w1->setHour(7);
w1->doSomeThing();
w1->setHour(9);
w1->doSomeThing();
delete w1;
return 0;
}
原文鏈接:https://fanjufei.blog.csdn.net/article/details/124794664
相關(guān)推薦
- 2022-12-27 flutter?text組件使用示例詳解_Android
- 2023-10-16 elementUI日期選擇器快速選擇 快捷選擇(本周、上周、本月、上月、季度等)
- 2022-07-16 構(gòu)建npm配置包
- 2022-03-29 C語(yǔ)言中的getchar()使用詳解_C 語(yǔ)言
- 2022-11-05 Android開(kāi)發(fā)RecyclerView實(shí)現(xiàn)折線圖效果_Android
- 2022-07-04 Python三數(shù)之和的實(shí)現(xiàn)方式_python
- 2022-07-10 redis主從配置+sentinel哨兵模式
- 2022-11-02 解決SecureCRT通過(guò)SSH連接Ubuntu時(shí)vi命令有多余的m的問(wèn)題_相關(guān)技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支