日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

设计模式--23、访问者模式

發(fā)布時(shí)間:2023/12/18 asp.net 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 设计模式--23、访问者模式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

?

訪問(wèn)者模式是一種較為復(fù)雜的行為型設(shè)計(jì)模式,它包含訪問(wèn)者和被訪問(wèn)元素兩個(gè)主要組成部分,這些被訪問(wèn)的元素通常具有不同的類(lèi)型,且不同的訪問(wèn)者可以對(duì)它們進(jìn)行不同的訪問(wèn)操作。例如處方單中的各種藥品信息就是被訪問(wèn)的元素,而劃價(jià)人員和藥房工作人員就是訪問(wèn)者。訪問(wèn)者模式使得用戶可以在不修改現(xiàn)有系統(tǒng)的情況下擴(kuò)展系統(tǒng)的功能,為這些不同類(lèi)型的元素增加新的操作。

????? 在使用訪問(wèn)者模式時(shí),被訪問(wèn)元素通常不是單獨(dú)存在的,它們存儲(chǔ)在一個(gè)集合中,這個(gè)集合被稱(chēng)為“對(duì)象結(jié)構(gòu)”,訪問(wèn)者通過(guò)遍歷對(duì)象結(jié)構(gòu)實(shí)現(xiàn)對(duì)其中存儲(chǔ)的元素的逐個(gè)操作。

????? 訪問(wèn)者模式定義如下:

訪問(wèn)者模式(Visitor Pattern):提供一個(gè)作用于某對(duì)象結(jié)構(gòu)中的各元素的操作表示,它使我們可以在不改變各元素的類(lèi)的前提下定義作用于這些元素的新操作。訪問(wèn)者模式是一種對(duì)象行為型模式。

????? 訪問(wèn)者模式的結(jié)構(gòu)較為復(fù)雜,其結(jié)構(gòu)如圖26-2所示:

?

?

?

????? 在訪問(wèn)者模式結(jié)構(gòu)圖中包含如下幾個(gè)角色:

????? ●Vistor(抽象訪問(wèn)者):抽象訪問(wèn)者為對(duì)象結(jié)構(gòu)中每一個(gè)具體元素類(lèi)ConcreteElement聲明一個(gè)訪問(wèn)操作,從這個(gè)操作的名稱(chēng)或參數(shù)類(lèi)型可以清楚知道需要訪問(wèn)的具體元素的類(lèi)型,具體訪問(wèn)者需要實(shí)現(xiàn)這些操作方法,定義對(duì)這些元素的訪問(wèn)操作。

????? ●ConcreteVisitor(具體訪問(wèn)者):具體訪問(wèn)者實(shí)現(xiàn)了每個(gè)由抽象訪問(wèn)者聲明的操作,每一個(gè)操作用于訪問(wèn)對(duì)象結(jié)構(gòu)中一種類(lèi)型的元素。

????? ●Element(抽象元素):抽象元素一般是抽象類(lèi)或者接口,它定義一個(gè)accept()方法,該方法通常以一個(gè)抽象訪問(wèn)者作為參數(shù)。【稍后將介紹為什么要這樣設(shè)計(jì)。】

????? ●ConcreteElement(具體元素):具體元素實(shí)現(xiàn)了accept()方法,在accept()方法中調(diào)用訪問(wèn)者的訪問(wèn)方法以便完成對(duì)一個(gè)元素的操作。

????? ●?ObjectStructure(對(duì)象結(jié)構(gòu)):對(duì)象結(jié)構(gòu)是一個(gè)元素的集合,它用于存放元素對(duì)象,并且提供了遍歷其內(nèi)部元素的方法。它可以結(jié)合組合模式來(lái)實(shí)現(xiàn),也可以是一個(gè)簡(jiǎn)單的集合對(duì)象,如一個(gè)List對(duì)象或一個(gè)Set對(duì)象。

????? 訪問(wèn)者模式中對(duì)象結(jié)構(gòu)存儲(chǔ)了不同類(lèi)型的元素對(duì)象,以供不同訪問(wèn)者訪問(wèn)。訪問(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)者模式中,抽象訪問(wèn)者定義了訪問(wèn)元素對(duì)象的方法,通常為每一種類(lèi)型的元素對(duì)象都提供一個(gè)訪問(wèn)方法,而具體訪問(wèn)者可以實(shí)現(xiàn)這些訪問(wèn)方法。這些訪問(wèn)方法的命名一般有兩種方式:一種是直接在方法名中標(biāo)明待訪問(wèn)元素對(duì)象的具體類(lèi)型,如visitElementA(ElementA elementA),還有一種是統(tǒng)一取名為visit(),通過(guò)參數(shù)類(lèi)型的不同來(lái)定義一系列重載的visit()方法。當(dāng)然,如果所有的訪問(wèn)者對(duì)某一類(lèi)型的元素的訪問(wèn)操作都相同,則可以將操作代碼移到抽象訪問(wèn)者類(lèi)中,其典型代碼如下所示:

[java]?view plain?copy
  • abstract?class?Visitor??
  • {??
  • ????public?abstract?void?visit(ConcreteElementA?elementA);??
  • ????public?abstract?void?visit(ConcreteElementB?elementB);??
  • ????public?void?visit(ConcreteElementC?elementC)??
  • ????{??
  • ????????//元素ConcreteElementC操作代碼??
  • ????}??
  • }??
  • ????? 在這里使用了重載visit()方法的方式來(lái)定義多個(gè)方法用于操作不同類(lèi)型的元素對(duì)象。在抽象訪問(wèn)者Visitor類(lèi)的子類(lèi)ConcreteVisitor中實(shí)現(xiàn)了抽象的訪問(wèn)方法,用于定義對(duì)不同類(lèi)型元素對(duì)象的操作,具體訪問(wèn)者類(lèi)典型代碼如下所示:

    [java]?view plain?copy
  • class?ConcreteVisitor?extends?Visitor??
  • {??
  • ????public?void?visit(ConcreteElementA?elementA)??
  • ????{??
  • ????????//元素ConcreteElementA操作代碼??
  • ????}??
  • ????public?void?visit(ConcreteElementB?elementB)??
  • ????{??
  • ????????//元素ConcreteElementB操作代碼??
  • ????}??
  • }??
  • ????? 對(duì)于元素類(lèi)而言,在其中一般都定義了一個(gè)accept()方法,用于接受訪問(wèn)者的訪問(wèn),典型的抽象元素類(lèi)代碼如下所示:

    [java]?view plain?copy
  • interface?Element??
  • {??
  • ????public?void?accept(Visitor?visitor);??
  • }??

  • ????? 需要注意的是該方法傳入了一個(gè)抽象訪問(wèn)者Visitor類(lèi)型的參數(shù),即針對(duì)抽象訪問(wèn)者進(jìn)行編程,而不是具體訪問(wèn)者,在程序運(yùn)行時(shí)再確定具體訪問(wèn)者的類(lèi)型,并調(diào)用具體訪問(wèn)者對(duì)象的visit()方法實(shí)現(xiàn)對(duì)元素對(duì)象的操作。在抽象元素類(lèi)Element的子類(lèi)中實(shí)現(xiàn)了accept()方法,用于接受訪問(wèn)者的訪問(wèn),在具體元素類(lèi)中還可以定義不同類(lèi)型的元素所特有的業(yè)務(wù)方法,其典型代碼如下所示:

    [java]?view plain?copy
  • class?ConcreteElementA?implements?Element??
  • {??
  • ????public?void?accept(Visitor?visitor)??
  • ????{??
  • ????????visitor.visit(this);??
  • ????}??
  • ??????
  • ????public?void?operationA()??
  • ????{??
  • ????????//業(yè)務(wù)方法??
  • ????}??
  • }??

  • ????? 在具體元素類(lèi)ConcreteElementA的accept()方法中,通過(guò)調(diào)用Visitor類(lèi)的visit()方法實(shí)現(xiàn)對(duì)元素的訪問(wèn),并以當(dāng)前對(duì)象作為visit()方法的參數(shù)。其具體執(zhí)行過(guò)程如下:

    ????? (1)?調(diào)用具體元素類(lèi)的accept(Visitor visitor)方法,并將Visitor子類(lèi)對(duì)象作為其參數(shù)

    ????? (2)?在具體元素類(lèi)accept(Visitor visitor)方法內(nèi)部調(diào)用傳入的Visitor對(duì)象的visit()方法,如visit(ConcreteElementA elementA),將當(dāng)前具體元素類(lèi)對(duì)象(this)作為參數(shù),如visitor.visit(this);

    ????? (3)?執(zhí)行Visitor對(duì)象的visit()方法,在其中還可以調(diào)用具體元素對(duì)象的業(yè)務(wù)方法。

    ????? 這種調(diào)用機(jī)制也稱(chēng)為“雙重分派”,正因?yàn)槭褂昧穗p重分派機(jī)制,使得增加新的訪問(wèn)者無(wú)須修改現(xiàn)有類(lèi)庫(kù)代碼,只需將新的訪問(wèn)者對(duì)象作為參數(shù)傳入具體元素對(duì)象的accept()方法,程序運(yùn)行時(shí)將回調(diào)在新增Visitor類(lèi)中定義的visit()方法,從而增加新的元素訪問(wèn)方式。

    ?

    思考

    雙重分派機(jī)制如何用代碼實(shí)現(xiàn)?

    ?


    ????? 在訪問(wèn)者模式中,對(duì)象結(jié)構(gòu)是一個(gè)集合,它用于存儲(chǔ)元素對(duì)象并接受訪問(wèn)者的訪問(wèn),其典型代碼如下所示:

    [java]?view plain?copy
  • class?ObjectStructure??
  • {??
  • ????private?ArrayList<Element>?list?=?new?ArrayList<Element>();?//定義一個(gè)集合用于存儲(chǔ)元素對(duì)象??
  • ??
  • ????public?void?accept(Visitor?visitor)??
  • ????{??
  • ????????Iterator?i=list.iterator();??
  • ??????????
  • ????????while(i.hasNext())??
  • ????????{??
  • ????????????((Element)i.next()).accept(visitor);?//遍歷訪問(wèn)集合中的每一個(gè)元素??
  • ????????}??
  • ????}??
  • ??
  • ????public?void?addElement(Element?element)??
  • ????{??
  • ????????list.add(element);??
  • ????}??
  • ??
  • ????public?void?removeElement(Element?element)??
  • ????{??
  • ????????list.remove(element);??
  • ????}??
  • }??

  • ????? 在對(duì)象結(jié)構(gòu)中可以使用迭代器對(duì)存儲(chǔ)在集合中的元素對(duì)象進(jìn)行遍歷,并逐個(gè)調(diào)用每一個(gè)對(duì)象的accept()方法,實(shí)現(xiàn)對(duì)元素對(duì)象的訪問(wèn)操作。

    ?

    思考

    訪問(wèn)者模式是否符合“開(kāi)閉原則”?【從增加新的訪問(wèn)者和增加新的元素兩方面考慮。】

    轉(zhuǎn)載于:https://www.cnblogs.com/snowbook/p/5207835.html

    總結(jié)

    以上是生活随笔為你收集整理的设计模式--23、访问者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 成人在线影片 | 亚洲在线网站 | 好大好爽视频 | 在线观看久草 | 日韩性爰视频 | 久久精品国产熟女亚洲AV麻豆 | 国产激情一区 | 欧美高清精品一区二区 | 中日韩av在线 | 亚洲精品欧美精品 | 亚洲三级欧美 | 免费国产视频在线观看 | av免费观看网站 | 最新中文av | 中国妇女做爰视频 | 好男人www | 狠狠精品干练久久久无码中文字幕 | 99久久精品免费看国产 | 欧美性猛交xxxx乱大交俱乐部 | 成人免费看| 青娱乐av在线 | 日日夜夜操操 | 一区二区三区视频在线播放 | 色呦呦免费 | 欧美成人综合网站 | 国产91色 | 农村寡妇一区二区三区 | 在线免费观看不卡av | 另类专区亚洲 | 午夜激情久久 | 亚洲第一看片 | 色婷婷香蕉在线一区二区 | 一本色道综合久久欧美日韩精品 | www.热久久| 日韩一区二区在线免费观看 | 欧美gv在线 | 粉嫩av一区二区三区四区五区 | 成人动漫视频在线观看 | 超碰日韩在线 | 亚洲激情片 | 黄色污在线观看 | 精品成人一区二区三区久久精品 | 国产内射一区 | 亚洲av综合色区无码另类小说 | 美腿丝袜亚洲综合 | 肉丝美足丝袜一区二区三区四 | 国产精品一区免费观看 | 色哟哟在线观看 | 好邻居韩国剧在线观看 | 欧美hdxxxx| 超碰在线99 | 欧美不卡影院 | 国产拍拍拍拍拍拍拍拍拍拍拍拍拍 | 亚洲片国产一区一级在线观看 | 91综合久久| 久久免费av | 欧美第二页 | 久久久无码一区二区三区 | 97精品人妻一区二区三区 | 99热播精品| 亚洲黄色大片 | 天天射天天干 | 十八禁视频网站在线观看 | 台湾性生生活1 | 番号动态图 | 欧美国产在线观看 | 成人免费看高清电影在线观看 | 性色综合| 狠狠干狠狠操视频 | 69人妻精品久久无人专区 | 中文字幕网址在线 | 日韩精品免费一区二区在线观看 | 久草热在线观看 | 免费成人av| 久久一区二区三区四区五区 | 欧美一级片免费在线观看 | 日日摸夜夜添狠狠添欧美 | 国产亚洲片 | 国产真实生活伦对白 | 色综合一区二区三区 | 日韩少妇| 尤物视频在线观看国产性感 | 日本毛片视频 | 国产视频大全 | 狠狠干少妇 | 99综合久久 | 色婷婷热久久 | 亚洲三级免费观看 | 成人久久18免费网站图片 | 中国精品久久久 | 麻豆做爰免费观看 | 国产精品96 | 精品久久网 | 一级性生活大片 | 久久精品亚洲一区 | 国产五十路 | 天天干视频在线 | 日韩视频一区二区在线观看 | 九九视频在线 |