定義:表示乙個作用於某物件結構中的各元素的操作,它使我們在不改變各元素的類的前提下定義作用於這些元素的新操作。訪問者模式是一種物件行為型模式。
成員:visitor(抽象訪問者)、concretevisitor(具體訪問者)、element(抽象元素)、concreteelement(具體元素)、objectstructure(物件結構)。
理解:這種模式所應用的情形在生活中比較常見,比如考完試出了乙份成績單,班主任安排了兩個學生,乙個學生負責找出所有掛科的同學把他們統計下來並叫到辦公室。另乙個學生負責計算總分累加後排名前十的同學,給他們發獎學金。
可以看到,成績單在這裡就是乙個具體物件,但兩個學生對這個物件所採取的的行為卻不一樣,乙個負責找出掛科的同學將他們叫到辦公室,乙個找到班級排名前十的同學給他們發獎學金。這兩個學生就是不同的訪問者,他們對相同的物件採取了不同的行為。
面對這類問題,就可以使用訪問者模式來解決。
類圖如下:
**實現:
//抽象訪問者
public
abstract
class
visitor
//具體訪問者一號
public
class
concretevisitor1
extends
visitor
public
void
visitb
(concreteelementb elementb)
}//具體訪問者二號
public
class
concretevisitor2
extends
visitor
public
void
visitb
(concreteelementb elementb)
}//抽象元素
public
inte***ce
element
//具體元素a
public
class
concreteelementa
implements
element..
....
}//具體元素b
public
class
concreteelementb
implements
element..
....
}//物件結構
public
class
objectstructure
}public
void
addelement
(element element)
public
void
removeelement
(element element)
}
以上是該模式所涉及到的所有成員。
這些成員具體的互動如下:
class
client
}
其實objectstructure這個類在邏輯互動中並不重要,只是實現了乙個類似於自動化的目標。具體邏輯的互動可以簡化為
elementa.
accept
(visitor1)
;
可以這樣理解,乙個訪問者1,他要訪問乙個公司辦理相應的業務,他首先要走到這個公司門口讓這個公司接受自己進入,即被訪問元素要呼叫accept()方法接受訪問者對自己的訪問,隨後,訪問者進入公司就可以用這個公司所提供的的服務辦理自己的業務,即進入公司的訪問者呼叫visit()方法,因為訪問的內容是其正身處的公司,所以visit()方法的引數應該為this,即visitor.visit(this);
從中也可以發現,該模式對新增新的訪問者很友好,但對新增新的具體元素很不友好,因為要為所有的訪問者新增操作該元素的方法,不符合開閉原則。
設計模式 訪問者模式
訪問者模式是一種資料操作與資料結構分離的設計模式,訪問者模式的基本想法是,軟體系統中擁有乙個由許多物件構成的 比較穩定的物件結構,這些物件的類都擁有乙個accept方法用來接受訪問者物件的訪問。訪問者是乙個介面,它擁有乙個visit方法,這個方法對訪問到的物件結構中不同型別的元素作出不同的處理。在物...
設計模式 訪問者模式
訪問者模式 visitor 表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。例子 男人和女人在不同的狀態下會有不同反應,採用訪問者模式,可以增加狀態很方便 抽象狀態類 class action 男人反應 virtual void getwom...
設計模式 訪問者模式
在訪問者模式 visitor pattern 中,我們使用了乙個訪問者類,它改變了元素類的執行演算法。通過這種方式,元素的執行演算法可以隨著訪問者改變而改變。這種型別的設計模式屬於行為型模式。根據模式,元素物件已接受訪問者物件,這樣訪問者物件就可以處理元素物件上的操作。1 符合單一職責原則。2 優秀...