1. 程式人生 > >23種設計模式介紹(三)---- 行為型模式

23種設計模式介紹(三)---- 行為型模式

不同 延遲 log 實現 其中 sta IE class 發出

由於設計模式篇幅比較大,如果在一篇文章講完所有的設計模式的話不利於閱讀。於是我把它分為三篇文章

  • 23種設計模式介紹(一)---- 創建型模式
  • 23種設計模式介紹(二)---- 結構型模式
  • 23種設計模式介紹(三)---- 行為型模式

  設計模式都是比較抽象的概念,所以大家一定要確保看懂類圖,而後再自己寫代碼加強記憶。

概述

  行為型模式一共有11種:

  • 模板方法模式(Template Method)
  • 策略模式(Strategy)
  • 命令模式(Command)
  • 中介者模式(Mediator)
  • 觀察者模式(Observer)
  • 叠代器模式(Iteratior)
  • 訪問者模式(Visiter)
  • 責任鏈模式(Chain of Responsibility)
  • 備忘錄模式(Memento)
  • 狀態模式(State)
  • 解釋器模式(Interpreter)

  其中有分為:

  算法封裝:模板方法、策略、命令模式

  對象去耦:中介、觀察者模式

  抽象集合:叠代器模式

  行為擴展:訪問者、責任鏈模式

  對象狀態:狀態模式

  解釋器模式

一、模板方法模式

  定義:定義一個操作中算法的骨架,而將一些步驟延遲到子類中。模板方法使子類可以重定義算法的某些特定步驟而不改變該算法的結構。

  適用:1.需要一次性實現算法的不變部分,並將可變行為留給子類來實現。2子類的共同行為應該被提出來放到公共類中,以避免代買重復。現有代碼的差別應該被分離為新的操作。然後用一個調用這些新操作的模板方法來替換這些不同的代碼。

  類圖:

技術分享圖片

二、策略模式

  定義:定義一系列算法,把它們一個個封裝起來,並且使它們可互相替換。本模式使得算法可獨立於使用它的客戶而變化。

  角色:策略接口(Strategy)、具體策略、環境對象

  理解:環境對象持有Strategy的引用,Strategy對象可以動態改

  類圖:

技術分享圖片

三、命令模式

  定義:將請求封裝成一個對象,從而可用不同的請求對客戶端進行參數化,對請求排隊或記錄請求日誌,以及支持可撤銷的操作。

  角色:客戶端(Client)、命令調用者(Invoker)、命令接口(Command)、具體命令(ConcreteCommand)、命令接收者(Receiver)

  理解:1.invoker保持有command的引用,command保持有Receiver的引用。2.客戶創建Receiver、ConcreteCommand並把Receiver設置給ConcreteCommand,客戶端直接通過ConcreteCommand.execute執行命令。或者創建一個Invoker並把ConcreteCommand設置給Invoker,然後通過Invoker來調用命令。

  類圖:

技術分享圖片

四、中介者模式

  定義:用中介對象封裝一系列的對象交互。中介者使得各對象不需要顯示地互相引用,從而使其耦合松散,而且可以獨立的改變它們之間的交互。

  角色:中介者接口(Mediator)、具體中介者、同事者接口(Colleague),具體同事者。

  理解:每個Colleague都有一個Mediator實例,Mediator應該知道所有的Colleague

  類圖:

技術分享圖片

技術分享圖片

五、觀察者

  定義:定義了一種一對多的關系,讓多個觀察者監聽某一主題對象,這個主題對象的狀態變化時,會通知所有觀察者對象,使它們自己更新自己

  角色:發布者接口(Subject)、具體發布者、監聽者接口(Observer)、具體監聽者。

  理解:Subject提供註冊於註銷的方法,客戶把所有的Observer註冊到Subject當中,當需要時Subject遍歷所有註冊的Observer並通知他們。

  類圖:

技術分享圖片

技術分享圖片

六、叠代器模式

  定義:提供一種方法順序的訪問一個聚合對象的各個元素,而又不暴露該對象內部表示

  角色:叠代器、集合

  理解:把遍歷集合的職能從集合本身轉移到叠代器對象,不同的叠代器可以執行不同的遍歷策略。

  適用:1.需要訪問組合對象的內容,而又不暴露其內部表示。2.需要通過多種方式遍歷組合對象3.需要提供一個統一的接口,用來遍歷各種類型組合對象。

  類圖:

 技術分享圖片

技術分享圖片

七、訪問者模式

  定義:表示一個作用於某對象結構中的各元素的操作。它讓我們可以在不改變各元素的類的前提下定義作用於這些元素的新操作。

  角色:訪問者(Vistor)接口、具體訪問者、訪問元素(Element)接口、具體元素

  理解:1.元素對象通常是“部分-整體”結構中的節點。2.客戶端創建一個ConcreteVistoer,把它傳給一個ConcreteElement,ConcreteElement的所有集合都接受ConcreteVistoer的訪問。

  適用:

  1. 一個復雜的對象結構包含很多其他對象,它們有不同的接口,但是相對這些對象實施一些依賴於其具體類型的操作。
  2. 需要對一個組合結構中的對象進行很多不相關的操作,但是不想讓這些操作汙染這些對象的類。可將相關操作集中起來,定義在一個訪問者類中,並在需要在訪問者中定義的操作時使用它。
  3. 定義復雜的結構類很少作修改,但經常需要向其添加新的操作。

  類圖:

  技術分享圖片

八、責任鏈模式

  定義:使多個對象都有機會處理請求,從而避免請求的發送者與接受者之間的耦合關系。將這個對象連成一條鏈傳遞該請求,直到有一個對象處理它為止。

  理解:對象引用同一類型的另一個對象,形成一條鏈。鏈中的每個對象實現了同樣的方法,處理對鏈中第一個對象發起的同一個請求。

  適用:

    1. 有多個對象可處理請求,而處理程序只有在運行時才能確定。
    2. 向一組對象發出請求,而不想現顯式指定處理請求的特定處理程序。

  類圖:

技術分享圖片

九、備忘錄模式

  定義:在不破壞封裝的前提下,捕獲一個對象的內部狀態,並在該對象之外保存這個狀態。這樣以後就可將該對象恢復到原先保存的狀態。、

  角色:有三個角色:發起人(Originatior)、備忘錄(Memento)、看管人(Caretaker)。

  理解:發起人生成一個備忘錄給看管人,看管人保存備忘錄。當需要時,看管人獲取備忘錄交給發起人,發起人根據備忘錄恢復自己。  

  類圖:

  技術分享圖片

技術分享圖片

十、狀態模式

  定義:允許一個對象在其內部狀態改變時改變他的行為。對象看起來似乎改變了它的類。

  角色:有2個角色:環境(context)、狀態(state)

  理解:1.state可以理解為一個接口。2.context持有state的一個實例,動態的改state就動態的改了context的行為。

  類圖:

  技術分享圖片

十一、解釋器模式

  定義:給定一個語言,定義它的文法的一種表示,並定義一個解釋器,這個解釋器使用該表示來解釋語言中的句子。

  角色:環境(context)、解釋器

  理解:給定一個環境,創建不同的解釋器並把環境傳給解釋器,不同的解釋器對環境有不同的解釋。

  類圖:

技術分享圖片

參考:23種設計模式介紹(三)---- 行為型模式

23種設計模式介紹(三)---- 行為型模式