我們去銀行櫃檯辦業務,一般情況下會開幾個個人業務櫃檯的,你去其中任何乙個櫃檯辦理都是可以的。我們的訪問者模式可以很好付諸在這個場景中:對於銀行櫃檯來說,他們是不用變化的,就是說今天和明天提供個人業務的櫃檯是不需要有變化的。而我們作為訪問者,今天來銀行可能是取消費流水,明天來銀行可能是去辦理手機銀行業務,這些是我們訪問者的操作,一直是在變化的。
訪問者模式就是表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。
抽象訪問者(visitor)角色:宣告了乙個或者多個訪問操作,形成所有的具體元素角色必須實現的介面。
具體訪問者(concretevisitor)角色:實現抽象訪問者角色所宣告的介面,也就是抽象訪問者所宣告的各個訪問操作。
抽象節點(element)角色:宣告乙個接受操作,接受乙個訪問者物件作為乙個參量。
具體節點(concreteelement)角色:實現了抽象元素所規定的接受操作。
結構物件(obiectstructure)角色:有如下的一些責任,可以遍歷結構中的所有元素;如果需要,提供乙個高層次的介面讓訪問者物件可以訪問每乙個元素;如果需要,可以設計成乙個復合物件或者乙個聚集,如列(
list
)或集合(
set)。
樣例:[cpp]view plain
copy
#include
#include
#include
using
namespace
std;
class
element;
class
visitor
; };
// "element"
class
element
; };
// "concreteelement"
class
employee :
public
element
void
accept( visitor *visitor )
};
class
incomevisitor :
public
visitor
};
class
vacationvisitor :
public
visitor
};
// "objectstructure"
class
employees
void
detach( employee *employee )
void
accept( visitor *visitor )
};
void
main( )
1,訪問者模式使得增加新的操作變得很容易。如果一些操作依賴於乙個複雜的結構物件的話,那麼一般而言,增加新的操作會很複雜。而使用訪問者模式,增加新的操作就意味著增加乙個新的訪問者類,因此,變得很容易。
2,訪問者模式將有關的行為集中到乙個訪問者物件中,而不是分散到乙個個的節點類中。
3,訪問者模式可以跨過幾個類的等級結構訪問屬於不同的等級結構的成員類。迭代子只能訪問屬於同乙個型別等級結構的成員物件,而不能訪問屬於不同等級結構的物件。訪問者模式可以做到這一點。
4,積累狀態。每乙個單獨的訪問者物件都集中了相關的行為,從而也就可以在訪問的過程中將執行操作的狀態積累在自己內部,而不是分散到很多的節點物件中。這是有益於系統維護的優點。
1,增加新的節點類變得很困難。每增加乙個新的節點都意味著要在抽象訪問者角色中增加乙個新的抽象操作,並在每乙個具體訪問者類中增加相應的具體操作。
2,破壞封裝。訪問者模式要求訪問者物件訪問並呼叫每乙個節點物件的操作,這隱含了乙個對所有節點物件的要求:它們必須暴露一些自己的操作和內部狀態。不然,訪問者的訪問就變得沒有意義。由於訪問者物件自己會積累訪問操作所需的狀態,從而使這些狀態不再儲存在節點物件中,這也是破壞封裝的。
訪問者設計模式
訪問者設計模式 被訪問者 有一些穩定的結構物件,提供accept方法供訪問者進行訪問 訪問者 一些訪問者,有乙個visitor方法實現對物件的訪問,不同的物件會做出不同的反應!應用 公司年終獎考核 被訪問者有 程式設計師,產品經理 accept visitor 訪問者 ceo,cto visit c...
設計模式 訪問者模式
訪問者模式是一種資料操作與資料結構分離的設計模式,訪問者模式的基本想法是,軟體系統中擁有乙個由許多物件構成的 比較穩定的物件結構,這些物件的類都擁有乙個accept方法用來接受訪問者物件的訪問。訪問者是乙個介面,它擁有乙個visit方法,這個方法對訪問到的物件結構中不同型別的元素作出不同的處理。在物...
設計模式 訪問者模式
訪問者模式 visitor 表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。例子 男人和女人在不同的狀態下會有不同反應,採用訪問者模式,可以增加狀態很方便 抽象狀態類 class action 男人反應 virtual void getwom...