设计模式-行为模式(读书笔记)
行為模式涉及到算法和對象間職責的分配,行為模式不僅描述對象或類的模式,還描述它們之間的通信模式。這些模式刻劃了在運行時難以跟蹤的復雜的控制流,將程序員的注意力從控制流轉移到對象間的聯系方式上來。
職責鏈(chain of responsibility)
使多個對象都有機會處理請求,從而避免請求的發送者和接收者之間的耦合關系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對象處理它為止。
Handler:定義一個處理請求的接口,實現后繼鏈
ConcreteHandler:處理它所負責的請求;可訪問它的后繼者;如果可處理請求就處理,否則將請求轉給后繼者
命令(command)
將一個請求封裝為一個對象,從而使你可用不同的請求對客戶進行參數化,對請求排隊或記錄請求日志,以及支持可撤銷的操作。
Command:聲明執行操作的接口
ConcreteCommand:將一個接收者對象綁定于一個動作,調用接收者相應的操作,以實現Execute
Client:創建一個具體命令對象并設定它的接收者
Invoker:要求該命令執行這個請求
Receiver:知道如何實施與執行一個請求相關的操作,任何類都可能作為一個接收者
不好理解哈,再記錄下具體的協作過程:
client創建一個ConcreteCommand對象并指定它的Receiver對象
某Invoker對象存儲該ConcreteCommand對象
該Invoker通過調用Command對象的Execute操作來提交一個請求,若該命令是可撤銷的,ConcreteCommand就在執行Execute操作之前存儲當前狀態以用于取消該命令
ConcreteCommand對象調用receiver的一些操作以執行該請求
解釋器(Interpreter)
給定一個語音,定義它的文法的一種表示,并定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。
AbstractionExpression:聲明一個抽象的解釋操作,這個接口為抽象語法樹中所有的節點所共享
TerminalExpression:實現與文法中的終結符相關聯的解釋操作;一個句子中的每個終結符需要該類的一個實例
NonterminalExpression:對文法中的每一條規則R::=R1R2...Rm都需要一個NonterminalExpression;為從R1到Rn的每個符號都維護一個AbstractExpression類型的實例變量;為文法中的非終結符實現解釋操作,解釋一般要遞歸地調用表示R1到Rn的那些對象的解釋操作
Context:包含解釋器之外的一些全局信息
迭代器(iterator)
提供一種方法順序訪問一個聚合對象中各個元素,而又不需暴露該對象的內部表示
Iterator:迭代器定義訪問和遍歷元素的接口
ConcreteIterator:具體迭代器實現迭代器接口,對該聚合遍歷時跟蹤當前位置
Aggregate:聚合定義創建相應迭代器對象的接口
ConcreteAggregate:具體聚合實現創建相應迭代器的接口,該操作返回ConcreteIterator的一個適當的實例。ConcreteIterator跟蹤聚合中的當前對象,并能夠計算出待遍歷的后繼對象
中介者(mediator)
用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯示地相互引用,從而使其耦合松散,而且可以獨立地改變它們之間的交互
Mediator:中介者定義一個接口用于與各Colleague對象通信
ConcreteMediator:具體中介通過協調各Colleague對象實現協作行為,了解并維護它的各個同事
Colleague:每一個Colleague都知道它的中介者對象,每一個Colleague對象在需與其他Colleague通信時,與它的中介者通信
同事向一個中介者對象發送和接收請求,中介者在各同事間適當地轉發請求以實現協作行為
備忘錄(memento)
在不破壞封裝性的前提下,捕獲一個對象的內部狀態,并在該對象之外保存這個狀態,這樣以后就可將該對象恢復到原先保存的狀態
Memento:備忘錄存儲原發器對象的內部狀態,原發器根據需要決定備忘錄存儲原發器的哪些內部狀態;防止原發器以外的其他對象訪問備忘錄
Originator:原發器創建一個備忘錄,用以記錄當前時刻它的內部狀態;使用備忘錄恢復內部狀態
Caretaker:負責保存好備忘錄,不能對備忘錄的內容進行操作或檢查
觀察者(observer)
定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新
Subject:目標知道它的觀察者,可以有任意多個觀察者觀察同一個目標;提供注冊和刪除觀察者對象的接口
Observer:為那些在目標發生改變時需獲得通知的對象定義一個更新接口
ConcreteSubject:將有關狀態存入各ConcreteObserver對象;當它的狀態發生改變時,向它的各個觀察者發出通知
ConcreteObserver:維護一個指向ConcreteSubject對象的引用;存儲有關狀態,這些狀態應與目標的狀態保持一致;實現observer的更新接口以使自身狀態與目標的狀態保持一致
狀態(state)
允許一個對象在其內部狀態改變時改變它的行為,對象看起來似乎修改了它的類
Context:定義客戶感興趣的接口,維護一個ConcreteState子類的實例,這個實例定義當前狀態
State:定義一個接口以封裝與Context的一個特定狀態相關的行為
ConcreteState:每一個子類實現一個與Context的一個狀態相關的行為
策略(strategy)
定義一系列的算法,把它們一個個封裝起來,并且使它們可相互替換,本模式使得算法可獨立于使用它的客戶而變化
Strategy:定義所有支持的算法的公共接口,Context使用這個接口來調用某ConcreteStrategy定義的算法
ConcreteStrategy:以Strategy接口實現某具體算法
Context:用一個ConcreteStrategy對象來配置,維護一個對Strategy對象的引用,可定義一個接口讓Strategy訪問它的數據
模板方法(template method)
定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。TemplateMethod使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟
AbstractClass:定義抽象的原語操作(primitive operation),具體的子類將重定義它們以實現一個算法的各步驟;實現一個模板方法,定義一個算法骨架,該模板方法不僅調用原語操作,也調用定義在AbstractClass或其他對象中的操作
ConcreteClass:實現原語操作以完成算法中與特定子類相關的步驟
訪問者(visitor)
表示一個作用于某對象結構中的各元素的操作,它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作
Visitor:為該對象結構中ConcreteElement的每一個類聲明一個visit操作。
ConcreteVisitor:實現每個由visitor聲明的操作
Element:定義一個Accept操作,以一個訪問者為參數
ConcreteElement:實現Accept操作,該操作以一個訪問者為參數
ObjectStructure:能枚舉它的元素,可以提供一個高層的接口以允許該訪問者訪問它的元素,可以是一個復合或是一個集合
總結
以上是生活随笔為你收集整理的设计模式-行为模式(读书笔记)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 十五、gawk命令使用
- 下一篇: 查看系统/内核版本