假設某人一整天的流程就是“吃飯→工作→睡覺”,并且他要嚴格按照這個流程來,那也就是說在吃飯狀态下,他隻能做跟吃飯有關的事情,而不能越界做工作或者睡覺有關的事情,這就涉及到了狀态的管理。在寫代碼的時候,我們常常要根據目前的狀态,來決定下一個狀态并且确定目前狀态下要做什麼樣的事情。一般來講,我們會寫一系列的if-else if-else if-else語句來實作,但是要是狀态非常多的時候,這種代碼不僅僅看起來十分長,而且看的人生理上也會有一種厭惡感并且看一點估計忘一點。導緻這種臭代碼的原因就是,我們一口氣在一個函數裡面管理了太多種的狀态。于是,有人就提出了,能不能讓狀态自己管理自己。也就有點像我們的行政制度中自治區,我們不再統一地在一個函數裡面管理N種狀态,而是讓某個狀态管理它自己本身。
經典的狀态管理模式如下圖所示

讓我來解釋一下這幅圖的意思,IState依賴于IContext,也就是IContext對應的實體類擁有一個IState類型的字段,在IContext類裡面的Request()方法裡面調用IState中的Handle方法。我們可以通過改變IContext裡面的IState實體類類型來改變狀态,進而實作根據不同的狀态使用不同的方法。
下面讓我們來段代碼說明一下。以下代碼模拟資料庫的連接配接、關閉。連接配接和關閉兩個狀态分别有兩個對應的狀态類與之對應。
1、首先我們還是先定義狀态的接口,另外定義一個抽象類,用來表示資料庫連接配接類。
在定義一個資料庫連接配接對象的抽象基類
2、我們再定義兩個具體類OpenState、CloseState,實作IConnectionState接口,分别代表資料庫開、關兩種狀态。并且在狀态類内部,如OpenState類的内部規定了在Opne狀态下,可以執行的操作和不能夠執行的操作。
3、下面我們用一個類來繼承抽象類,并進行測試。具體的類實作方式見下方,這裡隻給出關鍵函數。
從以上代碼,我們可以知道,原先需要用讨厭的if-else if-else if-else管理的讨厭的長長的狀态管理函數,已經被我們封裝在一個個的小狀态管理類裡面了,并且這些狀态管理類可以自己管理自己什麼狀态應該做什麼樣的事情。
狀态管理類完整代碼
本文轉自陳哈哈部落格園部落格,原文連結http://www.cnblogs.com/kissazi2/p/3285879.html如需轉載請自行聯系原作者
kissazi2