封裝一些作用於某種資料結構中的各元素的操作, 它可以在不改變資料結構的前提下定義作用於這些元素的新的操作。
● 符合單一職責原則
具體元素角色也就是employee抽象類的兩個子類負責資料的載入, 而visitor類則負責報表的展現, 兩個不同的職責非常明確地分離開來, 各自演繹變化。
● 優秀的擴充套件性
由於職責分開, 繼續增加對資料的操作是非常快捷的, 例如, 現在要增加乙份給大老闆的報表, 這份報**式又有所不同, 直接在visitor中增加乙個方法, 傳遞資料後進行整理列印。
● 靈活性非常高
例如, 資料彙總, 就以剛剛我們說的employee的例子, 如果我現在要統計所有員工的工資之和, 怎麼計算? 把所有人的工資for迴圈加一遍? 是個辦法, 那我再提個問題, 員工工資×1.2, 部門經理×1.4, 總經理×1.8, 然後把這些工資加起來, 你怎麼處理? 1.2, 1.4, 1.8是什麼? 不是吧? ! 你沒看到領導不論什麼時候都比你拿得多, 工資獎金就不說了, 就是過節發個慰問券也比你多, 就是這個係數在作祟。 我們繼續說你想怎麼統計? 使用for迴圈, 然後使用instanceof來判斷是員工還是經理? 這可以解決, 但不是個好辦法, 好辦法是通過訪問者模式來實現, 把資料扔給訪問者, 由訪問者來進行統計計算
class
node
(object):
pass
class
a(node):
pass
class
b(node):
pass
class
c(a, b):
pass
class
visitor
(object):
defvisit
(self, node, *args, **kwargs):
meth = none
for cls in node.__class__.__mro__:
meth_name = 'visit_' + cls.__name__
meth = getattr(self, meth_name, none)
if meth:
break
ifnot meth:
meth = self.generic_visit
return meth(node, *args, **kwargs)
defgeneric_visit
(self, node, *args, **kwargs):
print('generic_visit ' + node.__class__.__name__)
defvisit_b
(self, node, *args, **kwargs):
print('visit_b ' + node.__class__.__name__)
a = a()
b = b()
c = c()
visitor = visitor()
visitor.visit(a)
visitor.visit(b)
visitor.visit(c)
### output ###
# generic_visit a
# visit_b b
# visit_b c
Java設計模式之訪問者模式 Visitor 實踐
訪問者模式定義 主要將資料結構與資料操作分離。需要處理穩定的資料結構和易變的操作耦合問題,此時可以使用訪問者模式。以下 演示訪問者模式簡單的實際運用 定義乙個介面gohome package com.ldl.cn.visitormodel public inte ce gohome定義乙個類goho...
設計模式 訪問者模式
訪問者模式是一種資料操作與資料結構分離的設計模式,訪問者模式的基本想法是,軟體系統中擁有乙個由許多物件構成的 比較穩定的物件結構,這些物件的類都擁有乙個accept方法用來接受訪問者物件的訪問。訪問者是乙個介面,它擁有乙個visit方法,這個方法對訪問到的物件結構中不同型別的元素作出不同的處理。在物...
設計模式 訪問者模式
訪問者模式 visitor 表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。例子 男人和女人在不同的狀態下會有不同反應,採用訪問者模式,可以增加狀態很方便 抽象狀態類 class action 男人反應 virtual void getwom...