我們去銀行櫃檯辦業務,一般情況下會開幾個個人業務櫃檯的,你去其中任何乙個櫃檯辦理都是可以的。我們的訪問者模式可以很好付諸在這個場景中:對於銀行櫃檯來說,他們是不用變化的,就是說今天和明天提供個人業務的櫃檯是不需要有變化的。而我們作為訪問者,今天來銀行可能是取消費流水,明天來銀行可能是去辦理手機銀行業務,這些是我們訪問者的操作,一直是在變化的。
訪問者模式就是表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。
類圖:
抽象訪問者(visitor)角色:宣告了乙個或者多個訪問操作,形成所有的具體元素角色必須實現的介面。
具體訪問者(concretevisitor)角色:實現抽象訪問者角色所宣告的介面,也就是抽象訪問者所宣告的各個訪問操作。
抽象節點(element)角色:宣告乙個接受操作,接受乙個訪問者物件作為乙個參量。
具體節點(concreteelement)角色:實現了抽象元素所規定的接受操作。
結構物件(obiectstructure)角色:有如下的一些責任,可以遍歷結構中的所有元素;如果需要,提供乙個高層次的介面讓訪問者物件可以訪問每乙個元素;如果需要,可以設計成乙個復合物件或者乙個聚集,如列(
list
)或集合(
set)。
樣例:#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,破壞封裝。訪問者模式要求訪問者物件訪問並呼叫每乙個節點物件的操作,這隱含了乙個對所有節點物件的要求:它們必須暴露一些自己的操作和內部狀態。不然,訪問者的訪問就變得沒有意義。由於訪問者物件自己會積累訪問操作所需的狀態,從而使這些狀態不再儲存在節點物件中,這也是破壞封裝的。
設計模式之訪問者模式
先看一下下面這段 class person public string getaction public void setaction string action public void getconclusion else if action exciting else if action gri...
設計模式之訪問者模式
定義 表示一介作用於某個物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。結構圖 示例 public inte ce vistor public class concretevisitor1 implements vistor override public ...
設計模式之訪問者模式
定義 表示乙個作用於某物件結構中的各元素的操作,它使得使用者可以再不改變各元素的累的前提下定義作用於這些元素的新操作,它是一種物件行為模式。類圖 說明 抽象訪問者visitor是乙個抽象訪問者,宣告訪問者可以訪問哪些元素 具體訪問者concretevisitor就是指訪問者訪問到乙個類後要做什麼事情...