設計模式入門:狀態模式 State Pattern

閱讀時間約 1 分鐘

你有沒有注意到,有些應用程式的行為會根據不同的狀態而有所不同?當你使用音樂播放器時,按下「播放」按鈕,播放器會開始播放音樂;當音樂處於暫停狀態時,按下同一個按鈕卻是繼續播放,而不是重頭播放。這就是狀態模式的典型應用。每一個狀態都對應著不同的行為,而這些行為隨著狀態的變化而變化。


什麼是狀態模式?

狀態模式是一種設計模式,讓物件根據內部狀態改變行為。簡單來說物件的動作不再依賴外部邏輯,而是由它當下的狀態決定。這不僅讓程式更容易維護,還可以避免大量的條件判斷,讓程式碼看起來更清楚明瞭。


音樂播放器的例子

想像一個音樂播放器,它可能有「播放」、「暫停」、「停止」這三種狀態。當播放器處於「播放」狀態時,按下「播放」按鈕是沒有反應的,因為它已經在播放了;但是在「暫停」狀態下,按下同樣的按鈕則會恢復播放。這樣的設計能讓程式碼變得更簡潔,因為每個狀態只處理自己該做的事情。


狀態模式的好處

狀態模式的優勢就是靈活性和易於維護。如果你想新增一個新功能,比如說「快轉」,你只需要新增一個新的狀態,而不必修改整個播放器的核心邏輯。另外它還能讓程式更加清晰,因為不同的狀態分別處理自己的行為,讓程式碼不會被各種條件判斷搞得一團亂。


總結一下,狀態模式讓我們能夠將一個系統的行為和狀態分離開來,當狀態變化時,自然就會有不同的行為反應,這樣的設計讓程式更容易維護,也更具彈性。


若想了解設計模式的真實應用,歡迎參考我今年在iThome鐵人賽的文章。
https://ithelp.ithome.com.tw/articles/10348440

    avatar-img
    6會員
    83內容數
    對於經營自媒體、部落格或社群媒體感興趣?我專注於提供實用的寫作技巧、數位行銷策略,以及個人成長建議。 每週,我會分享提升寫作技巧、優化部落格經營、有效管理社群媒體、以及投資理財的寶貴知識。追蹤我,獲得實用的工具和建議,讓你的個人品牌和財務管理更上一層樓!
    留言0
    查看全部
    avatar-img
    發表第一個留言支持創作者!
    ShengYu的沙龍 的其他內容
    想像一下你要準備一場派對,需要買很多東西:零食、飲料、裝飾品等等。通常你可能得跑好幾個商店,每個商品都要分別結帳,光是想到這就覺得頭大。但現在有了一個新的購物平台,你只要把想買的東西全部加到購物車,然後點一下「結帳」,這些東西就會自動送到你家。這不就是超方便嗎?這就是 門面模式 Facade Pat
    今天來聊聊一個有趣的組合模式 Composite Pattern。想像你正在整理電腦裡的檔案。有時候你會打開單一的檔案,有時候則是整個資料夾。不論是單一檔案還是資料夾,你都希望能用相同的方式來處理它們,比如移動或刪除它們,這就是組合模式要解決的問題! 什麼是組合模式? 組合模式是一種結構型設
    當你旅行到不同國家時,你可能會遇到不同的插座類型和電壓規格。如果你只帶了一台手機充電器,卻沒有合適的轉接器,無論你的手機多麼高級它都無法充電。這時候一個小小的插頭轉接器就能救你一命,讓你的裝置可以順利使用。這個插頭轉接器的角色,就像軟體設計中的轉接器模式 Adapter Pattern 一樣。
    想像你進入一家高級餐廳準備點餐。菜單上的選擇繁多,而你不只是想要某個固定套餐,而是希望有些特別的要求,比如多點一份沙拉,少放一點醬料。這樣的客製化訂單流程,其實就很像建造者模式。 建造者模式是一種專門用來建立複雜物件的設計模式。它將物件的建立過程分解成一個個小步驟,讓你可以靈活選擇每一個步驟的內容
    想像你正坐在一間高級餐廳裡。你不會直接走進廚房告訴廚師你想吃什麼,而是向服務生點餐。服務生記下你的要求,然後傳達給廚房。這個看似簡單的過程,其實蘊含了一個軟體設計概念,那就是命令模式 Command Pattern。今天就來聊聊這個能讓程式碼更具彈性的設計模式。 什麼是命令模式? 命令模式是一種行
    在生活中我們有時會遇到無法直接完成某些事情的情況,於是我們請來了一個「代理」來幫我們處理一切。比如你想買一台限量版遊戲機,但因為距離太遠或沒時間親自去購買,你就找了一個代購服務來幫你完成購買。這個代購就是你的「代理」。 在軟體設計中,代理模式 Proxy Pattern 的概念也很類似,它是一
    想像一下你要準備一場派對,需要買很多東西:零食、飲料、裝飾品等等。通常你可能得跑好幾個商店,每個商品都要分別結帳,光是想到這就覺得頭大。但現在有了一個新的購物平台,你只要把想買的東西全部加到購物車,然後點一下「結帳」,這些東西就會自動送到你家。這不就是超方便嗎?這就是 門面模式 Facade Pat
    今天來聊聊一個有趣的組合模式 Composite Pattern。想像你正在整理電腦裡的檔案。有時候你會打開單一的檔案,有時候則是整個資料夾。不論是單一檔案還是資料夾,你都希望能用相同的方式來處理它們,比如移動或刪除它們,這就是組合模式要解決的問題! 什麼是組合模式? 組合模式是一種結構型設
    當你旅行到不同國家時,你可能會遇到不同的插座類型和電壓規格。如果你只帶了一台手機充電器,卻沒有合適的轉接器,無論你的手機多麼高級它都無法充電。這時候一個小小的插頭轉接器就能救你一命,讓你的裝置可以順利使用。這個插頭轉接器的角色,就像軟體設計中的轉接器模式 Adapter Pattern 一樣。
    想像你進入一家高級餐廳準備點餐。菜單上的選擇繁多,而你不只是想要某個固定套餐,而是希望有些特別的要求,比如多點一份沙拉,少放一點醬料。這樣的客製化訂單流程,其實就很像建造者模式。 建造者模式是一種專門用來建立複雜物件的設計模式。它將物件的建立過程分解成一個個小步驟,讓你可以靈活選擇每一個步驟的內容
    想像你正坐在一間高級餐廳裡。你不會直接走進廚房告訴廚師你想吃什麼,而是向服務生點餐。服務生記下你的要求,然後傳達給廚房。這個看似簡單的過程,其實蘊含了一個軟體設計概念,那就是命令模式 Command Pattern。今天就來聊聊這個能讓程式碼更具彈性的設計模式。 什麼是命令模式? 命令模式是一種行
    在生活中我們有時會遇到無法直接完成某些事情的情況,於是我們請來了一個「代理」來幫我們處理一切。比如你想買一台限量版遊戲機,但因為距離太遠或沒時間親自去購買,你就找了一個代購服務來幫你完成購買。這個代購就是你的「代理」。 在軟體設計中,代理模式 Proxy Pattern 的概念也很類似,它是一
    你可能也想看
    Google News 追蹤
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    Thumbnail
    這篇內容,將會講解什麼是「repeat迴圈」,以及與「repeat迴圈」相關的知識。包括repeat迴圈的簡介、break、continue。
    Thumbnail
    這篇內容,將會講解什麼是「while迴圈」,以及與「while迴圈」相關的知識。包括while迴圈的簡介、while迴圈、break、continue。
    Thumbnail
    這篇內容,將會講解什麼是表達式(Expression),什麼是陳述式(Statement)。有了這些概念,各位會更容易理解,要如何設計程式碼。
    Thumbnail
    本文介紹了在網站開發中如何運用狀態機的原則和設計方法。通過具體案例分析,以及狀態和數據的區分,詳細介紹了狀態機的設計原則和應用。讀者可以通過本文瞭解如何將狀態機應用於實際的網站開發中。
    Thumbnail
    此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
    Thumbnail
    在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
    ※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
    Thumbnail
    本章節提供了關於Typescript中流程控制元素的詳細介紹,包括if, else if, else語句,三元運算子,switch語句,各種for迴圈,while迴圈,循環嵌套和控制迴圈語句(break,continue和標籤)的使用。
    ※ 單例模式介紹 ※ 定義:單例模式是一種設計模式,確保一個class(類)只有一個實例,並提供一個存取它的全域存取點。無論如何取值,皆只對這個實例取值。 ※ 目的:保證一個類別只會產生一個物件,而且提供存取該物件的統一方法。 ※ 講解:單例模式確保一個類無論怎麼 new 或 get,都只能拿
    Thumbnail
    這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
    Thumbnail
    11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
    Thumbnail
    Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
    Thumbnail
    這篇內容,將會講解什麼是「repeat迴圈」,以及與「repeat迴圈」相關的知識。包括repeat迴圈的簡介、break、continue。
    Thumbnail
    這篇內容,將會講解什麼是「while迴圈」,以及與「while迴圈」相關的知識。包括while迴圈的簡介、while迴圈、break、continue。
    Thumbnail
    這篇內容,將會講解什麼是表達式(Expression),什麼是陳述式(Statement)。有了這些概念,各位會更容易理解,要如何設計程式碼。
    Thumbnail
    本文介紹了在網站開發中如何運用狀態機的原則和設計方法。通過具體案例分析,以及狀態和數據的區分,詳細介紹了狀態機的設計原則和應用。讀者可以通過本文瞭解如何將狀態機應用於實際的網站開發中。
    Thumbnail
    此章節的目的是介紹Java程式語言中的流程控制結構,包括條件語句(if, else if, else)、三元運算子、switch語句,以及各種迴圈(for, foreach, while)。同時,也解釋了如何在迴圈中使用控制語句來改變程式的執行流程。每種主題都配有示例程式碼以幫助理解。
    Thumbnail
    在網路速度有限的情況下,依序記錄不斷產生的資訊,能統計使用者在頁面上操作了哪些功能。
    ※ 生產者和消費者模式 定義: 生產者和消費者在同一時間內共同存取某一個資料空間。生產者負責生成數據並將其放入共享空間,消費者負責從共享空間中取走數據進行處理。兩者之間互不相干,也不須互相知道對方的存在。 共同存取資料空間:生產者和消費者共享同一個資料空間。這個空間通常是緩衝區或隊列,用於在它
    Thumbnail
    本章節提供了關於Typescript中流程控制元素的詳細介紹,包括if, else if, else語句,三元運算子,switch語句,各種for迴圈,while迴圈,循環嵌套和控制迴圈語句(break,continue和標籤)的使用。
    ※ 單例模式介紹 ※ 定義:單例模式是一種設計模式,確保一個class(類)只有一個實例,並提供一個存取它的全域存取點。無論如何取值,皆只對這個實例取值。 ※ 目的:保證一個類別只會產生一個物件,而且提供存取該物件的統一方法。 ※ 講解:單例模式確保一個類無論怎麼 new 或 get,都只能拿