visitor模式也叫訪問者模式,是行為模式之一,它分離物件的資料和行為,使用visitor模式,可以不修改已有類的情況下,增加新的操作。
比如有乙個公園,有一到多個不同的組成部分;該公園存在多個訪問者:清潔工a負責打掃公園的a部分,清潔工b負責打掃公園的b部分,公園的管理者負責檢點各項事務是否完成,上級領導可以視察公園等等。也就是說,對於同乙個公園,不同的訪問者有不同的行為操作,而且訪問者的種類也可能需要根據時間的推移而變化(行為的擴充套件性)。根據軟體設計的開閉原則(對修改關閉,對擴充套件開放),我們怎麼樣實現這種需求呢?
1、 訪問者角色(visitor):為該物件結構中具體元素角色宣告乙個訪問操作介面。該操作介面的名字和引數標識了傳送訪問請求給具體訪問者的具體元素角色。這樣訪問者就可以通過該元素角色的特定介面直接訪問它。
2、具體訪問者角色(concrete visitor):實現每個由訪問者角色(visitor)宣告的操作。
3、元素角色(element):定義乙個accept操作,它以乙個訪問者為引數。
4、具體元素角色(concrete element):實現由元素角色提供的accept操作。
5、物件結構角色(object structure):這是使用訪問者模式必備的角色。它要具備以下特徵:能列舉它的元素;可以提供乙個高層的介面以允許該訪問者訪問它的元素;可以是乙個復合(組合模式)或是乙個集合,如乙個列表或乙個無序集合。
下面,用**來實現一下訪問者模式
首先,先新建乙個公園的各個組成部分(因為有了各個組成部分才能有公園,所以我們先建各個組成部分,再建公園)
新建乙個公園各個部分的抽象類(元素角色element),需要傳入乙個訪問者,一會後面會建立訪問者
/*
* 公園每一部分的抽象
*/public
inte***ce
parkelement
再新建公園的各個部分,這是具體元素角色(concrete element)
關鍵**:在資料基礎類裡面有乙個方法接受訪問者,將自身引用傳入訪問者。
public
class
parka
implements
parkelement
}
public
class
parkb
implements
parkelement
}
有了公園的各個部分,我們就可以開始新建公園了,這就是物件結構角色(object structure)
/*
* 整個公園,其中包含了公園的各個部分
*/public
class
park
implements
parkelement
@override
public
void
accept
(visitor visitor)
}
有了公園,我們就可以開始建造訪問者了,先建造訪問者角色(visitor)
/*
* 其中包含訪問公園不同區域的過載方法,其中過載的引數park,parka,parkb,不僅可以獲得公園的資訊,還用來作為過載的條件
*/public
inte***ce
visitor
然後在建造具體訪問者角色,就是具體訪問者角色(concrete visitor)
/*
* 清潔工a負責公園a的清潔情況
*/public
class
visitora
implements
visitor
@override
public
void
visit
(parka parka)
@override
public
void
visit
(parkb parkb)
}
/*
* 清潔工b負責公園b的清潔情況
*/public
class
visitorb
implements
visitor
@override
public
void
visit
(parka parka)
@override
public
void
visit
(parkb parkb)
}
/*
* 公園管理員負責檢查整個公園的衛生情況
*/public
class
visitormanager
implements
visitor
@override
public
void
visit
(parka parka)
@override
public
void
visit
(parkb parkb)
}
最後,新建乙個客戶端
public
class
mainclass
}
這樣,乙個訪問者模式的例子就完成了,一定把上面的程式看懂
主要將資料結構與資料操作分離,解決了穩定的資料結構和易變的操作耦合問題。
需要對乙個物件結構中的物件進行很多不同的並且不相關的操作,而需要避免讓這些操作"汙染"這些物件的類,使用訪問者模式將這些封裝到類中。
1、物件結構中物件對應的類很少改變,但經常需要在此物件結構上定義新的操作。
2、需要對乙個物件結構中的物件進行很多不同的並且不相關的操作,而需要避免讓這些操作"汙染"這些物件的類,也不希望在增加新操作時修改這些類。
優點:符合單一職責原則。
優秀的擴充套件性。
靈活性。
缺點:具體元素對訪問者公布細節,違反了迪公尺特原則。
具體元素變更比較困難。
違反了依賴倒置原則,依賴了具體類,沒有依賴抽象。
注意事項:
訪問者可以對功能進行統一,可以做報表、ui、***與過濾器。
(二十四)訪問者模式
訪問者模式,表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的心操作。dp visitor.cpp 定義控制台應用程式的入口點。訪問者模式,使用於資料結構相對穩定的系統。它把資料結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由地演化。...
設計模式(二十四) 訪問者模式
訪問者模式,表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。1.如下 using system namespace visitor using system namespace visitor using system namespace v...
訪問者模式(行為型)
在實際開發中也會遇到這種情況,有乙個屬性類e,有abcd四個屬性,另外有四個類abcd,要去訪問類e,a只訪問屬性a,b只訪問屬性b,c只訪問屬性c,d只訪問屬性d。這時候訪問者模式就派上用場了。定義 封裝一些作用於某種資料結構中的各元素的操作,它可以在不改變這個資料結構的前提下定義作用於這些元素的...