亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

訪問(wèn)者模式-對(duì)象行為型

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

原理

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

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

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

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

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

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

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

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

組成

 下載 (4).png

  訪問(wèn)者模式涉及到的角色如下:

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

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

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

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

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

優(yōu)缺點(diǎn)

訪問(wèn)者模式的優(yōu)點(diǎn)

  ●  好的擴(kuò)展性

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

  ●  好的復(fù)用性

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

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

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

訪問(wèn)者模式的缺點(diǎn)

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

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

  ●  破壞封裝

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

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

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

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


發(fā)布手記

熱門詞條