什麼是狀態模式
在現實生活我們在不同的時候點會做不同的事情.也會有不同的狀態.當然,程式設計的是世界中我們也會在不同的時間可能有不同的狀態,不同的處理,這時我們就要用到狀態模式了.她的目的就是:允許物件在內部狀態發生改變時改變它的行為,物件看起來好像修改了它的類。
狀態模式的例子
狀態模式的介面
package com.designpattern.state;
/** * 狀態模式的介面
* * @author jason
* */
public inte***ce state
抽象層(可有可無)
package com.designpattern.state;
/** * 狀態的抽象實現
* * @author jason
* */
public abstract class abstractstate implements state
}
三個具體的狀態(早上,中午,晚上)
package com.designpattern.state;
/** * 早上的狀態
* * @author jason
* */
public class morningstate extends abstractstate
if (min_time <= time.gettime() && max_time > time.gettime()) else }}
package com.designpattern.state;
/** * 下午的狀態
* * @author jason
* */
public class afternoonstate extends abstractstate
if (min_time <= time.gettime() && max_time > time.gettime())
if (max_time < time.gettime())
}}package com.designpattern.state;
/** * 晚上的狀態
* * @author jason
* */
public class eveningstate extends abstractstate
if (min_time <= time.gettime() && max_time > time.gettime())
if (time.gettime() > max_time) }}
埠類(對狀態進行維護)
package com.designpattern.state;
/** * 狀態管理的容器
* * @author jason
* */
public class context
public void dothing()
public state getstate()
public void setstate(state state)
public int gettime()
public void settime(int time)
}
測試類
package com.designpattern.state;
import org.junit.test;
/** * 狀態模式的測試類
* * @author jason
* */
public class testcase
}
狀態模式的優缺點優點在不同狀態需要有不同響應的使用場景下,避免了使用if/else導致**臃腫,使**結構清晰的同時保證了拓展性和維護性。
缺點
增加了類的個數,讓**感覺有點混亂,但易於維護.
狀態模式的使用場景
(1)物件的行為依賴於它的狀態,並且可以在執行時根據狀態改變行為。
(2)**中包含大量與物件狀態有關的if/else語句,這些條件對應於物件的各種狀態,這些冗餘條件語句的出現導致**的可維護性和靈活性變差,這種情況適合使用狀態模式進行優化。
閒言碎語
從**可以看出,為了保證狀態的轉換,我們在具體的的狀態類中也需要寫大量的if-else去確保狀態間進行正確的切換.我曾經嘗試使用模板方法將其進行轉換的的部分進行抽離.但發現無法進行完全抽離.存在這個問題的可能是我對狀態模式的理解有誤.也可能是與之結合的方法有誤.這個問題待日後再試!
狀態模式和策略模式從結構上看十分相似.但他們內部執行的機理是完全不同.可以拿策略模式的**和狀態模式進行比較便可知道!
23種設計模式 狀態模式
在軟體構建過程中,某些物件的狀態如果改變,其行為也會隨之而發生變化。比如文件處於唯讀狀態,其支援的行為和讀寫狀態支援的行為就可能完全不同。如何在執行時根據物件的狀態來透明地更改物件的行為?而不會對物件的操作和狀態轉化之間引入緊耦合?允許乙個物件在其內部狀態改變時改變它的行為。從而使物件看起來似乎修改...
23種設計模式之狀態模式
定義 當乙個物件內在狀態改變時允許其改變行為,這個物件看起來像改變了其類 通俗的說,就是乙個事物有不同的狀態,在不同狀態下執行各個方法時有不同的表現,將每個狀態都封裝成乙個類,然後通過上下文物件統一管理 其類圖如下 其中的三個角色如下 state 抽象狀態角色 介面或抽象類,負責物件狀態定義,並且封...
23種設計模式 狀態模式 20
在狀態模式 state pattern 中,類的行為是基於它的狀態改變的。這種型別的設計模式屬於行為型模式。在狀態模式中,我們建立表示各種狀態的物件和乙個行為隨著狀態物件改變而改變的 context 物件。介紹意圖 允許物件在內部狀態發生改變時改變它的行為,物件看起來好像修改了它的類。主要解決 物件...