行為型模式用於描述程式在執行時複雜的流程控制,即描述多個類或物件之間怎樣相互協作共同完成單個物件都無法單獨完成的任務,它涉及演算法與物件間職責的分配。
行為型模式分為類行為模式和物件行為模式,前者採用繼承機制來在類間分派行為,後者採用組合或聚合在物件間分配行為。由於組合關係或聚合關係比繼承關係耦合度低,滿足「合成復用原則」,所以物件行為模式比類行為模式具有更大的靈活性。
行為型模式包含以下 11 種模式:
模板方法(template method)模式:定義乙個操作中的演算法骨架,將演算法的一些步驟延遲到子類中,使得子類在可以不改變該演算法結構的情況下重定義該演算法的某些特定步驟。
策略(strategy)模式:定義了一系列演算法,並將每個演算法封裝起來,使它們可以相互替換,且演算法的改變不會影響使用演算法的客戶。
命令(command)模式:將乙個請求封裝為乙個物件,使發出請求的責任和執行請求的責任分割開。
狀態(state)模式:允許乙個物件在其內部狀態發生改變時改變其行為能力。
觀察者(observer)模式:多個物件間存在一對多關係,當乙個物件發生改變時,把這種改變通知給其他多個物件,從而影響其他物件的行為。
中介者(mediator)模式:定義乙個中介物件來簡化原有物件之間的互動關係,降低系統中物件間的耦合度,使原有物件之間不必相互了解。
迭代器(iterator)模式:提供一種方法來順序訪問聚合物件中的一系列資料,而不暴露聚合物件的內部表示。
訪問者(visitor)模式:在不改變集合元素的前提下,為乙個集合中的每個元素提供多種訪問方式,即每個元素有多個訪問者物件訪問。
備忘錄(memento)模式:在不破壞封裝性的前提下,獲取並儲存乙個物件的內部狀態,以便以後恢復它。
直譯器(interpreter)模式:提供如何定義語言的文法,以及對語言句子的解釋方法,即直譯器。
以上 11 種行為型模式,除了模板方法模式和直譯器模式是類行為型模式,其他的全部屬於物件行為型模式,下面我們將詳細介紹它們的特點、結構與應用。
在父類中定義演算法的流程,而演算法的某些無法確定的細節,通過抽象函式的形式,在子類中去實現。
也可以理解為,一套演算法的某些步驟可能隨著業務的發展而改變,那麼我們可以將確定的步驟在父類中實現,而可變的步驟作為抽象函式讓其在子類中實現。
優點:
它封裝了不變部分,擴充套件可變部分。它把認為是不變部分的演算法封裝到父類中實現,而把可變部分演算法由子類繼承實現,便於子類繼續擴充套件。
它在父類中提取了公共的部分**,便於**復用。
部分方法是由子類實現的,因此子類可以通過擴充套件方式增加相應的功能,符合開閉原則。
缺點:
對每個不同的實現都需要定義乙個子類,這會導致類的個數增加,系統更加龐大,設計也更加抽象。
父類中的抽象方法由子類實現,子類執行的結果會影響父類的結果,這導致一種反向的控制結構,它提高了**閱讀的難度。
演算法的整體步驟很固定,但其中個別部分易變時,這時候可以使用模板方法模式,將容易變的部分抽象出來,供子類實現。
當多個子類存在公共的行為時,可以將其提取出來並集中到乙個公共父類中以避免**重複。首先,要識別現有**中的不同之處,並且將不同之處分離為新的操作。最後,用乙個呼叫這些新的操作的模板方法來替換這些不同的**。
當需要控制子類的擴充套件時,模板方法只在特定點呼叫鉤子操作,這樣就只允許在這些點進行擴充套件。
參考:(1)柴毛毛大話設計模式——開發常用的設計模式梳理
(2)模板方法模式(模板方法設計模式)詳解
行為型模式 模板方法
結構圖 模式說明 1.擴充套件點在抽象類abstractclass的實現子類。2.每乙個實現子類實現一種抽象方法的演算法實現,子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。3.客戶端可以替換不同的子類實現。4.定義乙個操作的演算法骨架,而將一些步驟延遲到子類中實現,模板方法使得子類...
行為型模式 模板方法
定義乙個操作中的演算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變乙個演算法的結構即可重定義該演算法的某些特定步驟。模板方法 template method 是乙個比較簡單的模式。它的主要思想是,定義乙個操作的一系列步驟,對於某些暫時確定不下來的步驟,就留給子類去實現好了,這樣不同的子類就可...
設計模式 行為型 模板方法模式
定義演算法框架,將一些步驟的實現延遲至子類,就是說把實現某一些功能會有一些重複的共有的步驟,放在公共的類中,將 不同的細節由其子類實現,例如炒菜,都要切菜,放油,和炒菜,但炒不同的菜需要放不同的調味料 定義乙個抽象類,將公共的方法提取出來構建模板方法,不同的則由其子類實現 create by hji...