设计模式21:State 状态模式(行为型模式)
生活随笔
收集整理的這篇文章主要介紹了
设计模式21:State 状态模式(行为型模式)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
State 狀態模式(行為型模式)
動機(Motivation)
在軟件構建過程中,某些對象的狀態如果改變,其行為也會隨之而發生變化,比如文檔處于只讀狀態,其支持的行為和讀寫狀態的行為就可能完全不同。
如何在運行時根據對象的狀態來透明地更改對象的行為?而不會為對象操作和狀態轉換之間引入緊耦合?
?
意圖(Intent)
允許一個對象在其內部狀態改變時改變它的行為。從而使對象看起來似乎修改了其行為。——《設計模式》GoF
?
?
結構(Structure)
示例代碼
public enum DocumentState{ReadOnly,Editable}public class Document{private DocumentState state;public void Handle(){if (state == DocumentState.ReadOnly){//... }else if (state == DocumentState.Editable){//... }}}?
當DocumentState改變時,也會引起Document的改變,這時就需要解耦:
public abstract class StatedDocument//抽象類——表示狀態及依賴狀態的行為,它是穩定的 {public abstract void Handle1();public abstract void Handle2();public abstract void Handle3();}public class ReadOnlyStatedDocument : StatedDocument{public override void Handle1(){//... }public override void Handle2(){//... }public override void Handle3(){//... }}public class EditableStatedDocument : StatedDocument{public override void Handle1(){//... }public override void Handle2(){//... }public override void Handle3(){//... }}public class Document//main logic 主邏輯 {private StatedDocument statedDocument;public void SetStatedDocument(StatedDocument statedDocument){this.statedDocument = statedDocument;}public void Handle1()//它不對應狀態,而是每個狀態會包含的一個方法 {statedDocument.Handle1();}public void Handle2(){statedDocument.Handle2();}public void Handle3(){statedDocument.Handle2();}}?
?
State模式的幾個要點
- State模式將所有與一個特定狀態相關的行為都放入一個State的子類對象中,在對象狀態切換時,切換相應的對象;但同時維持State的接口,這樣實現了具體操作與狀態轉換之間的解耦。
- 為不同的狀態引入不同的對象使得狀態轉換變得更加明確,而且可以保證不會出現狀態不一致的情況,因為轉換是原子性的——即要么徹底轉換過來,要么不轉換。
- 如果State對象沒有實例變量,那么各個上下文可以共享同一個State對象,從而節省對象開銷。
?
?
?
轉載請注明出處:
作者:JesseLZJ
出處:http://jesselzj.cnblogs.com
轉載于:https://www.cnblogs.com/jesselzj/p/4774742.html
總結
以上是生活随笔為你收集整理的设计模式21:State 状态模式(行为型模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ctrl与Caps Lock键的交换
- 下一篇: ubuntu 14.04 安装Java