设计模式学习(五):行为型模式
行為模式涉及到算法和對象間職責的分配。行為模式不僅描述對象或類的模式,還描述它們之間的通信模式。這些模式刻畫了在運行時難以跟蹤的復雜的控制流。它們將你的注意力從控制流轉移到對象間的聯系方式上。
行為型模式的三個典型特點:
封裝變化
對象作為參數
對發送者和接收者解耦
Chain of Responsibility
意圖:為解除請求的發送者和接收者之間耦合,而使多個對象都有機會處理這個請求。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它。
動機: 解除請求的發送者和接收者之間耦合,在對象間傳遞待處理的請求。
適用性:用于請求的跨層傳遞,解除請求發送者和請求的最終處理者之間的耦合。統一地處理客戶請求。常用于窗口系統,處理鼠標或鍵盤事件,典型應用:wxWidget的事件系統。
結構: 客戶請求一般采用Command封裝,使易于傳遞。一般不同對象采用統一的接口來處理請求。如果請求處理者對象存放在列表中,一般要求使用繼承實現。
優點: 易于請求的跨層傳遞;解除對象耦合(封裝請求的真實處理者);統一請求處理(封裝請求的變化)。
組合模式: 經常采用Command來封裝不同類型的請求.
Command
意圖:將一個請求封裝為一個對象,從而可用不同的請求對客戶進行參數化(傳遞請求);對請求排隊或記錄請求日志,以及支持可取消的操作。
動機: 封裝請求的類型;讓請求具有對象的特性(具有狀態的實體),這樣就可以傳遞、保存或者采用不同的方式來處理請求對象。
結構: 用繼承來封裝請求的類型;除了不一樣的構造和初始化函數外,提供一致的核心接口。
優點: 讓請求具有對象的特性,使客戶能夠采用不同的方式來處理請求對象,比如可以解除對象構造和對象使用的耦合,即實體解耦和時間解耦。
用途: 經常用于數據庫事務操作,設備控制,多線程核心(Active Object)以及GUI的do/undo管理等。或者用于消除過多的條件分派。
組合模式: 經常用于Chain ofResponsibility中的請求封裝;經常和Composite組合使用,提供統一的對待Command的途徑,封裝“一對多”的關系。
Iterator
意圖:提供一種方法順序訪問一個聚合對象中各個元素, 而又不需暴露該對象的內部表示。
動機: 封裝對對象的訪問規則或者算法。本質:提供一致的遍歷接口
適用性: 適用于為多個不同聚合類提供一致的遍歷接口。
結構:抽象迭代器提供類似hasNext(),Next(), Remove()等接口,并由具體聚合類通過createIterator()創建具體的迭代器。
優點: 封裝聚合類內部實現,提供一致對外接口
Interpreter
意圖:給定一個語言, 定義它的文法的一種表示,并定義一個解釋器, 該解釋器使用自身定義表示來解釋語言中的句子。
動機: 采用不同的對象來表示不同的文法,使文法易于組合使用。提供一種可選擇的方式,將易變的組合邏輯推給客戶代碼。
結構:將每一個語法規則表示成一個類,方便于實現語言。
適用性:方便實現簡單語言的解釋器(常用yacc和lex工具來編寫語言的解釋器原型)
Mediator
意圖:用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可獨立地改變它們之間的交互。
動機: 封裝多個對象間的交互關系,解除耦合。
適用性: 適用于多個對象交互關系復雜且易變的情況。常用于協調GUI組件。
結構: 提供一個幕后類來統一管理不同對象間的交互關系。
優點: 封裝多個對象間的交互關系,使客戶更加容易編程。
Memento
意圖:在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態。這樣以后就可將該對象恢復到保存的狀態。
動機: 保存對象狀態,用于對象狀態的回滾或重新構造。
適用性: 用于對象內部狀態易變,且對象狀態具有某種價值的場合。
結構: 使用簡單的結構體即可完成任務。
優點: 提供保存對象的另一種選擇。
缺點:存儲耗時,常用語言自帶的序列化(serialization)機制存儲系統狀態。
Observer
意圖:定義對象間的一種一對多的依賴關系,以便當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并自動刷新。
動機: 封裝對象間一對多的依賴關系,提供統一的管理點。
適用性: 所有具有一對多依賴關系且需要傳遞狀態信息的對象管理。
結構: 使用雙抽象結構(主題和觀察者),一個抽象管理主題狀態的通知行為(簡化主題派生類的行為),一個抽象用于封裝不同的狀態觀察者。
優點: 在具有多個觀察者時,可簡化狀態通知部分的Hard-coding,并且易于擴展。
變化: 在狀態比較復雜的情況下,一般采用某種約定的參數來提示觀察者狀態發生了什么樣的變化,簡化對象更新過程。
State
意圖:允許一個對象在其內部狀態改變時改變它的行為(外部行為)。對象看起來似乎修改了它所屬的類。
動機: 分離狀態機的邏輯和動作;或者是分離狀態和行為(動作)。
結構:state定義所用具體狀態的共同接口(事件接口);任何具體狀態實現該相同接口。Context擁有所有狀態對象。根據不同事件,context在不同狀態對象中切換,從而改變自身行為。
優點:避免用戶直接和狀態交互;去除掉大量的條件語句;使系統更加易于擴展和維護。
變化:1)一般來講,當狀態改變是固定的,狀態轉換邏輯適合放在Context中;當轉換更動態的時候,通常將狀態轉換邏輯放在State中,但這會使狀態類之間產生依賴。總之,該決策決定了究竟哪個類是對修改封閉的(context或state)。2)如有多個Context,則可考慮共享所有的狀態類。
補充:有限狀態自動機(FSM)
有限狀態自動機的兩種表示方式: 狀態遷移圖(STD)和狀態遷移表(STT)
狀態遷移圖(STD)至少由4部分組成。圓形表示狀態;連接狀態的箭頭被稱為遷移;遷移被用一個后面跟著動作名的時間做了標記,組成事件/動作對。類似數字電子中的狀態轉移圖,本質上就是一個東西。
狀態遷移表(STT)用一個表的形式來描述系統中狀態的轉移。表中的每一列表示一個狀態遷移的完整過程。由下面4個部分組成一列:
起始狀態??觸發遷移的事件? 終止狀態?? 所執行的動作
使用狀態遷移圖(STD)和狀態遷移表(STT)來描述自動狀態機是非常有效的,并且非常容易檢測那么未知的以及沒有處理的狀態轉移情況。這對編程是很有幫助的,因為在實際編碼中,非常容易遺漏非正常的狀態轉移,而這些遺漏往往是錯誤的根源。
實現有限狀態自動機(FSM)的技術:
嵌套的switch/case語句,解釋遷移表和State模式。
在簡單其狀態遷移中,使用嵌套的switch/case語句就足夠的。在復雜情況下,使用State模式比較好。解釋遷移表也容易實現,但不是這里討論的目標,最主要的就是表的查找。
State的標準結構圖:
State模式徹底的分離了狀態機的邏輯和動作。動作是在Context類中實現的,而邏輯則是分布在State類的派生類中。這使得二者可以非常容易的獨立變化,互補影響。例如,只要使用State的另一個派生類。就可以非常容易地在一個不同的狀態邏輯中重用Context類的動作。此外,我們也可以在不影響State派生類邏輯的情況下創建Context的派生類來更改或者替換動作的實現。
可以使用狀態機的地方:作為GUI中高層應用策略;GUI交互控制器;分布式處理等。幾乎凡有狀態存在的地方均可以考慮采用有限狀態機。
Strategy
意圖:定義一系列的算法,把它們一個個封裝起來, 并且使它們可相互替換。該模式使得算法的變化可獨立于使用它的客戶。
動機: 封裝不同的算法。定制一組可以互換的算法族。
適用性: 同一個問題存在多種不同的解決方案。
結構: 為了滿足算法之間的互換性,必須使用繼承,并且遵循Liskov原則。
優點: 封裝算法的變化。
組合模式: 經常在使用算法的基類Context中使用Template Method。如果Context的派生類中要求所使用的算法動態改變,還常常把Factory Method內嵌到派生類中來創建不同的算法類。
區別:策略模式和狀態模式具有相同類圖。策略模式是圍繞可互換的算法來創建業務的,由Client自行決定具體策略。狀態模式則通過改變對象內部狀態幫助對象控制自己的行為。
Template Method
意圖:定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
動機: 消除子類中的重復代碼,簡化子類代碼。
適用性: 當各個子類中,混雜著不變和可變的行為時,就可以使用該模式。將不變的行為放入父類中,子類只需定制可變的行為。這里不變還包括行為的執行順序。
結構: 必須使用繼承關系。
優點: 消除子類的重復行為。
組合模式: 經常和FactoryMethod、Strategy一起使用。在分解不變和可變行為時,還常可借助組合方法(ComposeMethod)和Collecting Parameter模式。
Visitor
意圖:表示一個作用于某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。
動機: 在不改變原類(一般是特定的數據結構)的情況下,增加新的功能接口。
適用性: 原有的類結構不能或者不容易改變;或者新加的功能不屬于原類的職責范疇。
結構: 雙重分派。增加一個Visitor類,并針對所有要訪問的派生類增加單獨的訪問接口(在Visitor中)。本質上,Visitor模式中的兩次分派形成一個功能矩陣。Visitor的接口名字和其接受的派生類類型分別是功能矩陣的兩個變化軸。
優點: 使用Visitor模式,使程序中的數據結構(原類)獨立于它的用途。
用途: 一般如果應用程序中存在有需要以多種不同方式進行解釋的數據結構,就可以使用Visitor模式。比如使用Visitor模式來遍歷所有的配置數據來初始化不同的應用程序子系統。最常見的應用:遍歷大量的數據結構并產生不同類型的報表。
缺點:會破環組合類的封裝。
Null Object
意圖: 提供一個沒有任何行為的對象。
動機: 消除代碼中四處存在的無效對象判斷
適用性: 只要對無效對象的判斷邏輯多次出現時,就有引入Null Object的必要。
結構: Null Object肯定是作為派生類的一個種類出現,并用于取代沒有合適派生類可用的情形。比如,對象放在Map中,查找可能無效。
優點: 消除對無效對象的判斷邏輯,提供系統的可靠性。
---------------------------------------------------
兄弟的公司:立即購--手機購物,誠信網購
兄弟的公司:立即團
歡迎轉載,請注明作者和出處
總結
以上是生活随笔為你收集整理的设计模式学习(五):行为型模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VC++程序调试
- 下一篇: RHEL4- ssh服务(二)ssh服务