8. 狀態模式

目錄

  • 一、應用背景
  • 二、狀態模式
    • 2.1 解決的問題
    • 2.2 角色
    • 2.3 實現步驟
  • 三、通用設計類圖
  • 四、實現
    • 4.1 設計類圖
    • 4.2 狀態轉換圖
    • 4.3 代碼實現

一、應用背景

  • 某對象發生變化時,其所能做的操作也隨之變化。
  • 應用程序的可維護性和重用性差
  • 代碼的邏輯較復雜

二、狀態模式

2.1 解決的問題

  • 允許一個對象在其內部狀態改變時改變化的行為

2.2 角色

  • 環境類(Context):客戶使用的對象料。維護一個State子類的實例,這個實例定義當前狀態
  • 抽象狀態類(State):定義一個抽象以封裝瑟Context的一個特定狀態相關的行為
  • 具體狀態類(ConcreteState):每一子類實現一個與Context的一個狀態相關的行為

2.3 實現步驟

  • 定義抽象狀態類,實現當前系統的真實狀態繼承自此抽象狀態類
  • 定義Context類,具有狀態的類,其中包含抽象狀態類的對象
  • 定義具體狀態類,實現當前系統的真實狀態類
    • 當Context類執行某個接口的方法時,去調用真實狀態類的實現方法
    • 當Context類修改狀態時,修改Context類的真實狀態對象

三、通用設計類圖

在這里插入圖片描述

  • Context:上下文/環境類,即狀態的擁有者
  • State:抽取出的抽象狀態類,里面規定了該類擁有的行
  • Concrete StateA:具體的狀態類

四、實現

  • 設置酒店房間管理功能

4.1 設計類圖

在這里插入圖片描述

  • 房間類:環境類,狀態擁有者
  • 房間狀態類:抽象類,定義房間的狀態信息
  • xxx狀態類:各種不同的房間狀態信息,繼承自房間狀態類

4.2 狀態轉換圖

在這里插入圖片描述

4.3 代碼實現

#include <iostream>class Room;class State
{
public:virtual std::string getState() = 0;virtual void book(Room* room) = 0;virtual void checkin(Room* room) = 0;virtual void unbook(Room* room) = 0;virtual void checkout(Room* room) = 0;
};class Room
{
protected:State* s;public:std::string getState(){return s->getState();}void setState(State* a){s = a;}void book(){s->book(this);}void checkin(){s->checkin(this);}void unbook(){s->unbook(this);}void checkout(){s->checkout(this);}
};class FreeState : public State
{
public:std::string getState() override{return "當前為空閑狀態";}void book(Room* room) override;void checkin(Room* room) override;void unbook(Room* room) override{std::cout << "當前為空閑狀態,無法進行取消預定操作" << std::endl;}void checkout(Room* room) override{std::cout << "當前為空閑狀態,無法進行退房操作" << std::endl;}
};class BookState : public State
{
public:std::string getState() override{return "當前為預定狀態";}void book(Room* room) override{std::cout << "當前已經是預定狀態,無須重復預訂" << std::endl;}void checkin(Room* room) override;void unbook(Room* room) override;void checkout(Room* room) override{std::cout << "當前是預定狀態,無須退房" << std::endl;}
};class CheckinState : public State
{
public:std::string getState() override{return "當前為入住狀態";}void book(Room* room) override{std::cout << "當前是入住狀態,無法預定" << std::endl;}void checkin(Room* room) override{std::cout << "當前是入住狀態,無須重復入住" << std::endl;}void unbook(Room* room) override{std::cout << "當前是入住狀態,無法取消預定" << std::endl;}void checkout(Room* room) override{std::cout << "退房操作" << std::endl;room->setState(new FreeState());}
};void FreeState::book(Room* room)
{std::cout << "預訂操作" << std::endl;room->setState(new BookState());
}void FreeState::checkin(Room* room)
{std::cout << "入住操作" << std::endl;room->setState(new CheckinState());
}void BookState::checkin(Room* room)
{std::cout << "入住操作" << std::endl;room->setState(new CheckinState());
}void BookState::unbook(Room* room)
{std::cout << "取消預訂操作" << std::endl;room->setState(new FreeState());
}int main()
{Room* r = new Room();State* s = new FreeState();r->setState(s);std::cout << "=============================" << std::endl;std::cout << r->getState() << std::endl;std::cout << "=============================" << std::endl;r->checkin();std::cout << r->getState() << std::endl;std::cout << "=============================" << std::endl;r->checkout();r->book();r->checkout();std::cout << r->getState() << std::endl;return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90744.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90744.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90744.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php語法--foreach和in_array的使用

文章目錄foreach基礎語法&#xff1a;案例1&#xff1a;引用傳遞模式&#xff1a;嵌套數組處理&#xff1a;避免在循環中計算數組長度&#xff1a;使用引用減少內存拷貝&#xff1a;打印數組in_array基礎使用嚴格使用foreach 基礎語法&#xff1a; foreach ($iterable as $va…

ES6模塊詳解:核心語法與最佳實踐

以下是 EMAScript 6&#xff08;ES6&#xff09;模塊規范的核心要點及細節解析&#xff1a; &#x1f4e6; 一、核心語法導出&#xff08;export&#xff09; 命名導出&#xff1a;支持導出多個具名成員。export const a 1; export function b() { /* ... */ } // 或集中導出 …

Python day25

浙大疏錦行 Python day25. 內容&#xff1a; 異常處理&#xff0c;在日常的編碼工作過程中&#xff0c;為了避免由于各種bug導致的異常情況&#xff0c;我們需要引入異常處理機制&#xff0c;它的工作場景是當程序運行出現意外時&#xff0c;可以根據編碼規則處理響應的錯誤。…

mac llama_index agent算術式子計算示例

本文通過簡單數學計算&#xff0c;示例llama_index使用agent解決復雜任務過程。 假設mac本地llama_index環境已安裝&#xff0c;過程參考 mac測試ollama llamaindex-CSDN博客 測試mac筆記本內存8G&#xff0c;所以使用較小LLM完成示例。 ollama pull qwen3:1.7b qwen3:1.7b能…

uni-app小程序云效持續集成

創建項目 必須是 cli 命令行創建的 uni-app 小程序項目參考uni-app官方構建命令&#xff1a; npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project生成小程序代碼上傳密鑰 管理-開發設置-小程序代碼上傳生成的文件放在根目錄即可 安裝持續集成插件 pnpm install uni-mi…

uniapp+高德地圖實現打卡簽到、打卡日歷

一、注冊高德地圖。應用管理創建應用&#xff0c;分別添加Andriod平臺、Web服務、Web端、微信小程序四種類型的key。二、考勤規則打卡地點選擇位置代碼&#xff1a;<script setup lang"ts"> import { onMounted, onUnmounted, reactive, ref, watchEffect } fr…

CentOS 7.9 + GCC9 離線安裝 IWYU(Include What You Use)

本教程適用于 離線環境下在 CentOS 7.9 系統中使用 GCC 9 離線安裝 IWYU 的完整步驟&#xff0c;涵蓋 Clang 11.1.0 編譯、IWYU 構建以及頭文件自動優化流程。&#x1f4e5; 一、準備安裝包請提前下載以下源碼包&#xff08;可通過在線機器提前下載&#xff0c;再傳輸到離線環境…

基于Dapr Sidecar的微服務通信框架設計與性能優化實踐

基于Dapr Sidecar的微服務通信框架設計與性能優化實踐 一、技術背景與應用場景 隨著微服務架構的廣泛應用&#xff0c;分布式系統中服務間通信、可觀察性、可靠性等問題日益凸顯。Dapr&#xff08;Distributed Application Runtime&#xff09;作為一個開源的微服務運行時&…

Claude Code 超詳細完整指南(2025最新版)

&#x1f680; 終端AI編程助手 | 高頻使用點 生態工具 完整命令參考 最新MCP配置 &#x1f4cb; 目錄 &#x1f3af; 快速開始&#xff08;5分鐘上手&#xff09;&#x1f4e6; 詳細安裝指南 系統要求Windows安裝&#xff08;WSL方案&#xff09;macOS安裝Linux安裝安裝驗…

【lucene】SegmentReader初始化過程概述

readers[i] new SegmentReader(sis.info(i), sis.getIndexCreatedVersionMajor(), IOContext.READ); 這個方法已經把所有的文件都讀完了么&#xff1f;沒有“讀完”&#xff0c;但已經**全部“打開”**了。| 動作 | 是否發生 | |---|---| | **打開文件句柄 / mmap** | ? 立即完…

通俗理解主機的BIOS和UEFI啟動方式

“對于 22.04 版本&#xff0c;這些操作說明應適用于通過 BIOS 或 UEFI 兩種方式創建和運行啟動盤。”我們來詳細解釋一下這句話的含義&#xff0c;這句話的核心意思是&#xff1a;你按照這個教程制作出來的 Ubuntu U 盤&#xff0c;將擁有極佳的兼容性&#xff0c;無論是在老電…

Canal 1.1.7的安裝

數據庫操作的準備 1、開啟 Binlog 寫入功能&#xff0c;配置 binlog-format 為 ROW 模式&#xff0c;my.cnf 中配置如下: vi /etc/my.cnf [mysqld] log-binmysql-bin # 開啟 binlog binlog-formatROW # 選擇 ROW 模式 server_id1 # 配置 MySQL replaction 需要定義&#xff0c;…

python---類型轉換

文章目錄1. 基本類型轉換函數int() - 轉換為整數float() - 轉換為浮點數str() - 轉換為字符串bool() - 轉換為布爾值2. 其他類型轉換list() - 轉換為列表tuple() - 轉換為元組set() - 轉換為集合&#xff08;去重&#xff09;dict() - 轉換為字典3. 注意事項1. 兼容性&#xff…

JVM terminated. Exit code=1

出現JVM terminated. Exit code1錯誤通常是因為 Eclipse 所需的 Java 版本與系統中配置的 Java 版本不匹配。從錯誤信息中可以看到關鍵線索&#xff1a;-Dosgi.requiredJavaVersion21&#xff0c;表示此 Eclipse 版本需要 Java 21 或更高版本&#xff0c;但系統當前使用的是 Ja…

20250727-1-Kubernetes 網絡-Ingress介紹,部署Ingres_筆記

一、NodePort存在的不足 ?1. 四層負載均衡 ?? 實現技術: 基于iptables和ipvs實現 OSI層級: 位于傳輸層(第四層) 轉發依據: 基于IP地址和端口進行轉發 特點: 只能看到IP和端口信息 無法識別應用層協議內容 配置簡單但功能有限 2. 七層負載均衡 ?1)七層負載均衡的概念 ?…

Javaweb————HTTP的九種請求方法介紹

??????一.HTTP1.0定義的三種請求方式介紹 &#x1f3cd;?&#x1f3cd;?&#x1f3cd;?&#xff08;1&#xff09;GET請求 作用&#xff1a;向服務器獲取資源&#xff0c;比如常見的查詢請求 應用場景&#xff1a;絕大多數場景&#xff0c;比如我們訪問商城首頁查看圖…

C++day06(練習題)

循序漸進-基礎訓練 格式化輸入輸出 【描述】格式化輸入輸出練習輸入三個整數和一個浮點數&#xff0c;浮點數需要保留的不同小數點后面的數字。 【輸入描述】三個正整數以及以一個浮點數 【輸出描述】三個整數以及保留不同位數的浮點數 【樣例輸入】 1 2 3 9.12345678 【樣例輸…

基于大模型的預訓練、量化、微調等完整流程解析

隨著大語言模型&#xff08;LLM&#xff09;的飛速發展&#xff0c;模型的訓練、部署與優化成為了AI工程領域的重要課題。本文將從 預訓練、量化、微調 等關鍵步驟出發&#xff0c;詳細介紹大模型的完整技術流程及相關實踐。1. 預訓練&#xff08;Pre-training&#xff09; 1.1…

AI入門學習-模型評估示例講解

from sklearn.metrics import classification_report, confusion_matrix from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import make_classification# 生成示例分類數據 # n_samples: 樣本…

Python編程:初入Python魔法世界

一、常量表達式在編程中&#xff0c;常量指的是在程序執行期間其值不會改變的數據項。雖然 Python 并沒有專門的語法來定義常量&#xff08;不像某些其他語言如 Java 中有 final 關鍵字&#xff09;&#xff0c;但在實踐中&#xff0c;我們通常通過約定俗成的方式來表示一個變量…