訪問者模式

標籤 :設計模式算法


引言設計模式

一個學校可能天天有不一樣的領導過來巡視檢查,今天來一個教育局領導檢查教育實施工做,明天來一個衛生局的領導檢查食堂衛生,後天來一個公安局的領導檢查安全消防安全設備。安全

每個領導會帶着不一樣的目的來訪問學校。數據結構

教育局領導的工做內容包括教育方針研討會、課堂旁聽和教師慰問;衛生局領導的工做內容包括檢查食堂廚房衛生、食品安全研討會等;公安局領導的工做內容包括設備巡查、消防演練、安全教育視頻觀看等。設計

這時領導是一個訪問者(Visitor),學校是一個數據元素(Element),工做內容就是訪問者的具體方法(VisitConcreteElementXXX)。學校只負責接待各位領導,而各級領導才知道本身具體作的事情。若是領導臨時決定要修改工做內容,學校不須要知道,且不須要作任何改變。這就是訪問者模式。視頻

類型對象

行爲型模式。blog

目的接口

將數據結構與數據操做分離。it

訪問者模式的目的是封裝一些施加於某種數據結構元素之上的操做,這些操做多是多個其餘操做的組合,一旦這些操做須要修改的話,接受這個操做的數據結構能夠保持不變。爲不一樣類型的元素提供多種訪問操做方式,且能夠在不修改客戶端代碼的狀況下增長新的操做方式,這就是訪問者模式的模式動機。

UML類結構

角色
Vistor: 抽象訪問者。爲該對象結構中的ConcreteElement的每個類聲明的一個操做。
ConcreteVisitor: 具體訪問者。實現Visitor申明的每個操做,每個操做實現算法的一部分。
Element: 抽象元素。定義一個Accept操做,它以一個訪問者爲參數。
ConcreteElement: 具體元素 。實現Accept操做。
ObjectStructure: 對象結構。通常是一個容器,如List、Set或者Map,可以枚舉它的元素,能夠提供一個高層的接口來容許訪問者訪問它的元素。

優點
(1)符合單一責任原則:即把數據對象的操做單獨封裝起來,使完成同一個功能的多種操做封裝到一個操做中,且客戶端無需感知。
(2)Visitor的擴展性良好:如要對數據對象產生新的操做,只需封裝一個新的ConcreteVisitor便可。

不足
由於Visitor封裝了對全部數據元素的操做,因此若是要添加一個新的數據元素(即ConcreteElement),則須要修改Visitor接口和實現了該接口的全部ConcreteVisitor,這方面的擴展性很差。因此訪問者模式最好用在數據元素已經徹底肯定的狀況,好比項目重構的狀況。

具體使用說明

Client端須要操做一個數據元素時,只須要讓該元素accept一個ConcreteVisitor。一旦須要改變操做的具體細節,不須要修改Client端,只須要修改ConcreteVisitor的VisitConcreteElementXXX方法的具體實現便可。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息