1. 程式人生 > >設計模式總結之Visitor Pattern(訪問者模式)

設計模式總結之Visitor Pattern(訪問者模式)

目錄

建立型設計模式: 結構型設計模式: 行為型設計模式:

Visitor Pattern(訪問者模式)

意圖

表示一個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。

適用性

* 一個物件結構包含很多類物件,它們有不同的介面,而你想對這些物件實施一些依賴於其具體類的操作。
* 需要對一個物件結構中的物件進行很多不同的並且不相關的操作,而你想避免讓這些操作“汙染”這些物件的類。Visitor使得你可以將相關的操作集中起來定義在一個類中。當該物件結構被很多應用共享時,用Visitor模式讓每個應用僅包含需要用到的操作。
* 定義物件結構的類很少改變,但經常需要在此結構上定義新的操作。改變物件結構類需要重定義對所有訪問者的介面,這可能需要很大的代價。如果物件結構類經常改變,那麼可能還是在這些類中定義這些操作較好。

總結一下,在這種地方你一定要考慮使用訪問者模式:業務規則要求遍歷多個不同的物件。這本身也是訪問者模式出發點,迭代器模式只能訪問同類或同介面的資料(當然了,如果你使用instanceof,那麼能訪問所有的資料,這沒有爭論),而訪問者模式是對迭代器模式的擴充,可以遍歷不同的物件,然後執行不同的操作,也就是針對訪問的物件不同,執行不同的操作。


結構





參與者:
Visitor(訪問者) 
— 為該物件結構中 ConcreteElement的每一個類宣告一個 Visit操作。該操作的名字和特 徵標識了傳送 Visit請求給該訪問者的那個類。這使得訪問者可以確定正被訪問元素 的具體的類。這樣訪問者就可以通過該元素的特定介面直接訪問它。 

ConcreteVisitor(具體訪問者)
— 實現每個由 Visitor宣告的操作。每個操作實現本演算法的一部分,而該演算法片斷乃是對應於結構中物件的類。ConcreteVisitor為該演算法提供了上下文並存儲它的區域性狀態。這一狀態常常在遍歷該結構的過程中累積結果。 ? Element(元素,如Node) 
— 定義一個Accept操作,它以一個訪問者為引數。

ConcreteElement(具體元素) 

— 實現Accept操作,該操作以一個訪問者為引數。 

ObjectStructure(物件結構) 
— 能列舉它的元素。
— 可以提供一個高層的介面以允許該訪問者訪問它的元素。
— 可以是一個複合(參見Composite組合模式)或是一個集合,如一個列表或一個無序集合。 


例子



另一個例子:





優缺點

> 優點:
1. 訪問者模式使得易於增加新的操作 訪問者使得增加依賴於複雜物件結構的構件的操作變得容易了。僅需增加一個新的訪問者即可在一個物件結構上定義一個新的操作。相反, 如果每個功能都分散在多個類之上的話,定義新的操作時必須修改每一類。 

2. 訪問者集中相關的操作而分離無關的操作 相關的行為不是分佈在定義該物件結構的 各個類上,而是集中在一個訪問者中。無關行為卻被分別放在它們各自的訪問者子類中。這 就既簡化了這些元素的類,也簡化了在這些訪問者中定義的演算法。所有與它的演算法相關的數 據結構都可以被隱藏在訪問者中。 

> 缺點:

1. 增加新的 ConcreteElement類很困難 
Visitor模式使得難以增加新的 Element的子類。每 新增一個新的 ConcreteElement都要在 Vistor中新增一個新的抽象操作,並在每一個 ConcretVisitor類中實現相應的操作。有時可以在 Visitor中提供一個預設的實現,這一實現可 以被大多數的 ConcreteVisitor繼承,但這與其說是一個規律還不如說是一種例外。 

所以在應用訪問者模式時考慮關鍵的問題是系統的哪個部分會經常變化,是作用於物件結構上的演算法呢還是構成該結構的各個物件的類。如果老是有新的 ConcretElement類加入進來的話, Vistor類層次將變得難以維護。在這種情況下,直接在構成該結構的類中定義這些操作可能更容易一些。如果 Element類層次是穩定的,而你不斷地增加操作獲修改演算法,訪問者模式可以幫助你管理這些改動。 

2. 破壞封裝 
訪問者方法假定ConcreteElement介面的功能足夠強,足以讓訪問者進行它 們的工作。結果是,該模式常常迫使你提供訪問元素內部狀態的公共操作,這可能會破壞它 的封裝性。 

相關推薦

設計模式總結Visitor Pattern訪問者模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: Visitor Pattern(訪問者模式) 意圖 表示一個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。適用性 * 一個物件結構包含很多類物件,它們有不同的

設計模式總結Proxy Pattern代理模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: Proxy Pattern(代理模式) 意圖 為其他物件提供一種代理以控制對這個物件的訪問。適用性 在需要用比較通用和複雜的物件指標代替簡單的指標的時候,使用Proxy模式。下面是一些可以使用Proxy模式常

設計模式總結Adapter Pattern介面卡模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: Adapter Pattern(介面卡模式) 意圖 將一個類的介面轉換成另外一個客戶希望的介面。Adapter 模式使得原本由於介面不相容而不能一起工作的那些類可以一起工作。 注:介面卡模式在詳細設計階段不需

設計模式總結Facade Pattern外觀模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: Facade Pattern(外觀模式) 意圖 為子系統中的一組介面提供一個一致的介面,Facade模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。適用性 * 當你要為一個複雜子系統提供一個簡單介

設計模式總結Prototype Pattern原型模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: Prototype Pattern(原型模式) 意圖 用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。適用性 •當要例項化的類是在執行時刻指定時,例如,通過動態裝載; •為了避免建立一個與產

設計模式總結TemplateMethod Pattern模版方法模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: TemplateMethod Pattern(模版方法模式) 意圖 定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。Template Method使得子類可以不改變一個演算法的結構即可重定義該演算法的

設計模式總結Iterator Pattern迭代器模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: Iterator Pattern(迭代器模式) 意圖 提供一種方法順序訪問一個聚合物件中各個元素, 而又不需暴露該物件的內部表示。適用性 1. 訪問一個聚合物件的內容而無需暴露它的內部表示。 2. 支援對聚合

設計模式總結Builder Pattern建造者模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: Builder Pattern(建造者模式) 意圖 將一個複雜物件的構建與它的表示分離,使得同樣的構建過程可以建立不同的表示。適用性 * 當建立複雜物件的演算法應該獨立於該物件的組成部分以及它們的裝配方式時。

設計模式總結Flyweight Pattern享元模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: Flyweight Pattern(享元模式) 意圖 運用共享技術有效地支援大量細粒度的物件。適用性 當以下所有的條件都滿足時,可以考慮使用享元模式: * 一個應用程式使用了大量的物件。 * 完全由於使用大量

設計模式總結Bridge Pattern橋接模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: Bridge Pattern(橋接模式) 意圖 將抽象部分與它的實現部分分離,使它們都可以獨立地變化。 【GOF95】在提出橋樑模式的時候指出,橋樑模式的用意是"將抽象化(Abstraction)與實現化(I

java設計模式Composite Pattern組合模式

In ima field 編程 這也 composite 當前 屬性 OS 組合模式是面向可維護性編程的一種常見的設計模式。簡單的說就是一個類裏面有一組當前類組成的collection作為這個類的屬性。這和遞歸有一定的相似。他的目的就是在同類型對象之間建立起樹形層次結構,一

【java設計模式 模板方法Template Method模式

1. 模板方法的一個例項         這一節主要來學習一下設計模式中的模板方法模式。我們先來看一個例子:假如現在老闆讓你做一個汽車的模型,要求只要完成基本功能即可,不考慮擴充套件性,那你會怎麼做呢?我們首先會根據經驗設計一個類圖:        由這個類圖可知,非

設計模式模板方法Template Method

模板方法的定義為:再一個操作中定義一個演算法的骨架,將演算法中的一些步驟延遲到子類去實現。模板方法允許子類在不該變演算法結構的情況下重新定義演算法的某些步驟。 Define the skeleton of an algorithm in an operation, defe

node總結工具模組Domain 模組

Node.js Domain(域) 簡化非同步程式碼的異常處理,可以捕捉處理try catch無法捕捉的異常,來看下引入 Domain 模組的語法格式: var domain = require("domain") domain模組,把處理多個不同的IO的操作作為一個組。註冊事件和回撥到

node總結工具模組Net 模組

Node.js Net 模組提供了一些用於底層的網路通訊的小工具,包含了建立伺服器/客戶端的方法,來看下引入該模組的語法格式: var net = require("net") 來看下net模組中的方法: 序號 方法 & 描述

node總結工具模組Path 模組

Node.js path 模組提供了一些用於處理檔案路徑的小工具,來看下引入該模組的語法格式: var path = require("path") 來看下方法: 序號 方法 & 描述 1 path.nor

node總結工具模組OS 模組

Node.js os 模組提供了一些基本的系統操作函式,來看下引入該模組的語法格式: var os = require("os") 來看下其中包含的方法: 序號 方法 & 描述 1 os.tmpdir()

node總結工具模組DNS 模組

Node.js DNS 模組用於解析域名,來看下引入 DNS 模組的語法格式: var dns = require("dns") 來看下dns模組中包含的方法: 序號 方法 & 描述 1 dns.looku

C#設計模式二十一訪問者模式Visitor Pattern【行為型】

href 集中 動態 元素 lis 聲明 風格 on() 封裝 原文:C#設計模式之二十一訪問者模式(Visitor Pattern)【行為型】一、引言 今天我們開始講“行為型”設計模式的第九個模式,該模式是【訪問者模式】,英文名稱是:Visitor Pattern。如

設計模式總結Factory Method Pattern工廠方法模式

目錄 建立型設計模式: 結構型設計模式: 行為型設計模式: Simple Factory Pattern(簡單工廠模式) GoF中認為簡單工廠模式是工廠方法的一個特例。 結構  例子  優缺點 優點: 優點: 簡單,結合單例模式更加方便和節省資源。 缺點: 增加新的