国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

訪問者模式-對象行為型

Original 2016-11-09 16:02:41 543
abstract:原理訪問者模式的目的是封裝一些施加于某種數(shù)據(jù)結(jié)構(gòu)元素之上的操作。一旦這些操作需要修改的話,接受這個操作的數(shù)據(jù)結(jié)構(gòu)則可以保持不變。1)訪問者模式中對象結(jié)構(gòu)存儲了不同類型的元素對象,以供不同訪問者訪問。2)訪問者模式包括兩個層次結(jié)構(gòu),一個是訪問者層次結(jié)構(gòu),提供了抽象訪問者和具體訪問者,一個是元素層次結(jié)構(gòu),提供了抽象元素和具體元素。相同的訪問者可以以不同的方式訪問不同的元素,相同的元素可以接受不同訪問者

原理

訪問者模式的目的是封裝一些施加于某種數(shù)據(jù)結(jié)構(gòu)元素之上的操作。一旦這些操作需要修改的話,接受這個操作的數(shù)據(jù)結(jié)構(gòu)則可以保持不變。

1)訪問者模式中對象結(jié)構(gòu)存儲了不同類型的元素對象,以供不同訪問者訪問。

2)訪問者模式包括兩個層次結(jié)構(gòu),一個是訪問者層次結(jié)構(gòu),提供了抽象訪問者和具體訪問者,一個是元素層次結(jié)構(gòu),提供了抽象元素和具體元素。

相同的訪問者可以以不同的方式訪問不同的元素,相同的元素可以接受不同訪問者以不同訪問方式訪問。在訪問者模式中,增加新的訪問者無須修改原有系統(tǒng),系統(tǒng)具有較好的可擴(kuò)展性。

訪問者模式以一種傾斜的方式支持“開閉原則”,增加新的訪問者方便,但是增加新的元素很困難。

訪問者模式適用于數(shù)據(jù)結(jié)構(gòu)相對未定的系統(tǒng),它把數(shù)據(jù)結(jié)構(gòu)和作用于結(jié)構(gòu)上的操作之間的耦合解脫開,使得操作集合可以相對自由地演化。

例子1:顧客在超市中將選擇的商品,如蘋果、圖書等放在購物車中,然后到收銀員處付款。在購物過程中,顧客需要對這些商品進(jìn)行訪問,以便確認(rèn)這些商品的質(zhì)量,之后收銀員計算價格時也需要訪問購物車內(nèi)顧客所選擇的商品。

此時,購物車作為一個ObjectStructure(對象結(jié)構(gòu))用于存儲各種類型的商品,而顧客和收銀員作為訪問這些商品的訪問者,他們需要對商品進(jìn)行檢查和計價。不同類型的商品其訪問形式也可能不同,如蘋果需要過秤之后再計價,而圖書不需要。

組成

 下載 (4).png

  訪問者模式涉及到的角色如下:

  ●  抽象訪問者(Visitor)角色:聲明了一個或者多個方法操作,形成所有的具體訪問者角色必須實現(xiàn)的接口。

  ●  具體訪問者(ConcreteVisitor)角色:實現(xiàn)抽象訪問者所聲明的接口,也就是抽象訪問者所聲明的各個訪問操作。

  ●  抽象節(jié)點(Node)角色:聲明一個接受操作,接受一個訪問者對象作為一個參數(shù)。

  ●  具體節(jié)點(ConcreteNode)角色:實現(xiàn)了抽象節(jié)點所規(guī)定的接受操作。

  ●  結(jié)構(gòu)對象(ObjectStructure)角色:有如下的責(zé)任,可以遍歷結(jié)構(gòu)中的所有元素;如果需要,提供一個高層次的接口讓訪問者對象可以訪問每一個元素;如果需要,可以設(shè)計成一個復(fù)合對象或者一個聚集,如List或Set。

優(yōu)缺點

訪問者模式的優(yōu)點

  ●  好的擴(kuò)展性

  能夠在不修改對象結(jié)構(gòu)中的元素的情況下,為對象結(jié)構(gòu)中的元素添加新的功能。

  ●  好的復(fù)用性

  可以通過訪問者來定義整個對象結(jié)構(gòu)通用的功能,從而提高復(fù)用程度。

  ●  分離無關(guān)行為

  可以通過訪問者來分離無關(guān)的行為,把相關(guān)的行為封裝在一起,構(gòu)成一個訪問者,這樣每一個訪問者的功能都比較單一。

訪問者模式的缺點

  ●  對象結(jié)構(gòu)變化很困難

  不適用于對象結(jié)構(gòu)中的類經(jīng)常變化的情況,因為對象結(jié)構(gòu)發(fā)生了改變,訪問者的接口和訪問者的實現(xiàn)都要發(fā)生相應(yīng)的改變,代價太高。

  ●  破壞封裝

  訪問者模式通常需要對象結(jié)構(gòu)開放內(nèi)部數(shù)據(jù)給訪問者和ObjectStructrue,這破壞了對象的封裝性。

與其他模式的區(qū)別

迭代器模式)由于訪問者模式需要對對象結(jié)構(gòu)進(jìn)行操作,而對象結(jié)構(gòu)本身是一個元素對象的集合,因此訪問者模式經(jīng)常需要與迭代器模式聯(lián)用,在對象結(jié)構(gòu)中使用迭代器來遍歷元素對象。

組合模式)在訪問者模式中,元素對象可能存在容器對象和葉子對象,因此可以結(jié)合組合模式來進(jìn)行設(shè)計。


Release Notes

Popular Entries