訪問者模式 (Visitor Pattern)
文件地址:《設計模式之禪》
切入故事: 員工的隱私何在
定義: Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates. (封裝一些作用於某種資料結構中的各元素的操作, 它可以在不改變資料結構的前提下定義作用於這些元素的新的操作。 )
通用類圖:
● Visitor——抽象訪問者
抽象類或者介面, 宣告訪問者可以訪問哪些元素, 具體到程式中就是visit方法的引數定義哪些物件是可以被訪問的。
● ConcreteVisitor——具體訪問者
它影響訪問者訪問到一個類後該怎麼幹, 要做什麼事情。
● Element——抽象元素
介面或者抽象類, 宣告接受哪一類訪問者訪問, 程式上是通過accept方法中的引數來定義的。
● ConcreteElement——具體元素
實現accept方法, 通常是visitor.visit(this), 基本上都形成了一種模式了。
● ObjectStruture——結構物件
元素產生者, 一般容納在多個不同類、 不同介面的容器, 如List、 Set、 Map等, 在專案中, 一般很少抽象出這個角色。
優點:
● 符合單一職責原則
● 優秀的擴充套件性
● 靈活性非常高
缺點:
● 具體元素對訪問者公佈細節
● 具體元素變更比較困難
● 違背了依賴倒置轉原則
使用場景: 業務規則要求遍歷多個不同的物件。
● 一個物件結構包含很多類物件, 它們有不同的介面, 而你想對這些物件實施一些依賴於其具體類的操作, 也就說是用迭代器模式已經不能勝任的情景。
● 需要對一個物件結構中的物件進行很多不同並且不相關的操作, 而你想避免讓這些操作“汙染”這些物件的類。