亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > PHP > 正文

學(xué)習(xí)php設(shè)計(jì)模式 php實(shí)現(xiàn)訪問者模式(Visitor)

2020-03-22 20:21:38
字體:
供稿:網(wǎng)友
訪問者模式表示一個(gè)作用于某對(duì)象結(jié)構(gòu)中各元素的操作。它可以在不修改各元素類的前提下定義作用于這些元素的新操作,即動(dòng)態(tài)的增加具體訪問者角色。
訪問者模式利用了雙重分派。先將訪問者傳入元素對(duì)象的Accept方法中,然后元素對(duì)象再將自己傳入訪問者,之后訪問者執(zhí)行元素的相應(yīng)方法。
訪問者模式多用在聚集類型多樣的情況下。在普通的形式下必須判斷每個(gè)元素是屬于什么類型然后進(jìn)行相應(yīng)的操作,從而誕生出冗長(zhǎng)的條件轉(zhuǎn)移語句。而訪問者模式則可以比較好的解決這個(gè)問題。對(duì)每個(gè)元素統(tǒng)一調(diào)用$element- accept($vistor)即可。
訪問者模式多用于被訪問的類結(jié)構(gòu)比較穩(wěn)定的情況下,即不會(huì)隨便添加子類。訪問者模式允許被訪問結(jié)構(gòu)添加新的方法。
Visitor模式實(shí)際上是分離了對(duì)象結(jié)構(gòu)中的元素和對(duì)這些元素進(jìn)行操作的行為,從而使我們?cè)诟鶕?jù)對(duì)象結(jié)構(gòu)中的元素進(jìn)行方法調(diào)用的時(shí)候,不需要使用IF語句判斷,也就是封裝了操作。
但是,如果增加新的元素節(jié)點(diǎn),則會(huì)導(dǎo)致包括訪問者接口及其子類的改變,這就會(huì)違反了html' target='_blank'>面向?qū)ο?/u>中的開閉原則。
當(dāng)這種情況出現(xiàn)時(shí),一般表示訪問者模式已經(jīng)可能不再適用了,或者說設(shè)計(jì)時(shí)就有問題了!
一、Visitor模式結(jié)構(gòu)圖
二、Visitor模式中主要角色1)抽象訪問者角色(Visitor):為該對(duì)象結(jié)構(gòu)(ObjectStructure)中的每一個(gè)具體元素提供一個(gè)訪問操作接口。該操作接口的名字和參數(shù)標(biāo)識(shí)了 要訪問的具體元素角色。這樣訪問者就可以通過該元素角色的特定接口直接訪問它。
2)具體訪問者角色(ConcreteVisitor):實(shí)現(xiàn)抽象訪問者角色接口中針對(duì)各個(gè)具體元素角色聲明的操作。
3)抽象節(jié)點(diǎn)(Node)角色:該接口定義一個(gè)accept操作接受具體的訪問者。
4)具體節(jié)點(diǎn)(Node)角色:實(shí)現(xiàn)抽象節(jié)點(diǎn)角色中的accept操作。
5) 對(duì)象結(jié)構(gòu)角色(ObjectStructure):這是使用訪問者模式必備的角色。它要具備以下特征:能枚舉它的元素;可以提供一個(gè)高層的接口以允許該訪問者訪問它的元素;可以是一個(gè)復(fù)合(組合模式)或是一個(gè)集合,如一個(gè)列表或一個(gè)無序集合(在PHP中我們使用數(shù)組代替,因?yàn)镻HP中的數(shù)組本來就是一個(gè)可以放置任何類型數(shù)據(jù)的集合)
三、Visitor模式的優(yōu)缺點(diǎn)
訪問者模式有如下的優(yōu)點(diǎn):
1)訪問者模式使得增加新的操作變得很容易。使用訪問者模式可以在不用修改具體元素類的情況下增加新的操作。它主要是通過元素類的accept方法來接受一個(gè)新的visitor對(duì)象來實(shí)現(xiàn)的。如果一些操作依賴于一個(gè)復(fù)雜的結(jié)構(gòu)對(duì)象的話,那么一般而言,增加新的操作會(huì)很復(fù)雜。而使用訪問者模式,增加新的操作就意味著增加一個(gè)新的訪問者類,因此,變得很容易。
2)訪問者模式將有關(guān)的行為集中到一個(gè)訪問者對(duì)象中,而不是分散到一個(gè)個(gè)的節(jié)點(diǎn)類中。
3)訪問者模式可以跨過幾個(gè)類的等級(jí)結(jié)構(gòu)訪問屬于不同的等級(jí)結(jié)構(gòu)的成員類。迭代子只能訪問屬于同一個(gè)類型等級(jí)結(jié)構(gòu)的成員對(duì)象,而不能訪問屬于不同等級(jí)結(jié)構(gòu)的對(duì)象。訪問者模式可以做到這一點(diǎn)。
4)積累狀態(tài)。每一個(gè)單獨(dú)的訪問者對(duì)象都集中了相關(guān)的行為,從而也就可以在訪問的過程中將執(zhí)行操作的狀態(tài)積累在自己內(nèi)部,而不是分散到很多的節(jié)點(diǎn)對(duì)象中。這是有益于系統(tǒng)維護(hù)的優(yōu)點(diǎn)。訪問者模式有如下的缺點(diǎn):
1)增加新的節(jié)點(diǎn)類變得很困難。每增加一個(gè)新的節(jié)點(diǎn)都意味著要在抽象訪問者角色中增加一個(gè)新的抽象操作,并在每一個(gè)具體訪問者類中增加相應(yīng)的具體操作。
2)破壞封裝。訪問者模式要求訪問者對(duì)象訪問并調(diào)用每一個(gè)節(jié)點(diǎn)對(duì)象的操作,這隱含了一個(gè)對(duì)所有節(jié)點(diǎn)對(duì)象的要求:它們必須暴露一些自己的操作和內(nèi)部狀態(tài)。不然,訪問者的訪問就變得沒有意義。由于訪問者對(duì)象自己會(huì)積累訪問操作所需的狀態(tài),從而使這些狀態(tài)不再存儲(chǔ)在節(jié)點(diǎn)對(duì)象中,這也是破壞封裝的。使用Visitor模式的前提: 對(duì)象群結(jié)構(gòu)中(Collection) 中的對(duì)象類型很少改變。
在接口Visitor和Element中,確保Element很少變化,也就是說,確保不能頻繁的添加新的Element元素類型加進(jìn)來,可以變化的是訪問者行為或操作,也就是Visitor的不同子類可以有多種,這樣使用訪問者模式最方便.
如果對(duì)象集合中的對(duì)象集合經(jīng)常有變化, 那么不但Visitor實(shí)現(xiàn)要變化,ConcreteVisitor也要增加相應(yīng)行為,GOF建議是,不如在這些對(duì)象類中直接逐個(gè)定義操作,無需使用訪問者設(shè)計(jì)模式。四、Visitor模式與其它模式1、如果所瀏覽的結(jié)構(gòu)對(duì)象是線性的,使用迭代模式而不是訪問者模式也是可以的
2、訪問者模式瀏覽合成模式的一些結(jié)構(gòu)對(duì)象
以上兩點(diǎn)來自《Java與模式》一書五、Visitor模式PHP示例
interface Visitor { public function visitConcreteElementA(ConcreteElementA $elementA); public function visitConcreteElementB(concreteElementB $elementB);interface Element { public function accept(Visitor $visitor); * 具體的訪問者1class ConcreteVisitor1 implements Visitor { public function visitConcreteElementA(ConcreteElementA $elementA) { echo $elementA- getName() . " visitd by ConcerteVisitor1 br / public function visitConcreteElementB(ConcreteElementB $elementB) { echo $elementB- getName() . " visited by ConcerteVisitor1 br / * 具體的訪問者2class ConcreteVisitor2 implements Visitor { public function visitConcreteElementA(ConcreteElementA $elementA) { echo $elementA- getName() . " visitd by ConcerteVisitor2 br / public function visitConcreteElementB(ConcreteElementB $elementB) { echo $elementB- getName() . " visited by ConcerteVisitor2 br / * 具體元素Aclass ConcreteElementA implements Element { private $_name; public function __construct($name) { $this- _name = $name; public function getName() { return $this- _name; * 接受訪問者調(diào)用它針對(duì)該元素的新方法 * @param Visitor $visitor public function accept(Visitor $visitor) { $visitor- visitConcreteElementA($this); * 具體元素Bclass ConcreteElementB implements Element { private $_name; public function __construct($name) { $this- _name = $name; public function getName() { return $this- _name; * 接受訪問者調(diào)用它針對(duì)該元素的新方法 * @param Visitor $visitor public function accept(Visitor $visitor) { $visitor- visitConcreteElementB($this); * 對(duì)象結(jié)構(gòu) 即元素的集合class ObjectStructure { private $_collection; public function __construct() { $this- _collection = array();
public function attach(Element $element) { return array_push($this- _collection, $element); public function detach(Element $element) { $index = array_search($element, $this- _collection); if ($index !== FALSE) { unset($this- _collection[$index]); return $index; public function accept(Visitor $visitor) { foreach ($this- _collection as $element) { $element- accept($visitor);class Client { * Main program. public static function main() { $elementA = new ConcreteElementA("ElementA"); $elementB = new ConcreteElementB("ElementB"); $elementA2 = new ConcreteElementB("ElementA2"); $visitor1 = new ConcreteVisitor1(); $visitor2 = new ConcreteVisitor2(); $os = new ObjectStructure(); $os- attach($elementA); $os- attach($elementB); $os- attach($elementA2); $os- detach($elementA); $os- accept($visitor1); $os- accept($visitor2);Client::main(); 以上就是使用php實(shí)現(xiàn)訪問者模式的代碼,還有一些關(guān)于訪問者模式的概念區(qū)分,希望對(duì)大家的學(xué)習(xí)有所幫助。PHP教程

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
久久久久亚洲AV成人无码国产| 999av视频| 欧美成人在线影院| 日韩av男人的天堂| 蜜桃久久影院| 一级特黄视频| 欧美日韩国产色站一区二区三区| 不卡视频免费播放| 亚洲欧美网站| 亚洲国产wwwccc36天堂| 欧美日韩精品区| 日韩最新av| 日韩伦理一区二区三区| 成人黄色免费网站| 日韩美女视频一区二区在线观看| 中国成人亚色综合网站| 国产精品高清亚洲| 啪啪av大全导航福利网址| 91麻豆精品一区二区三区| 播放灌醉水嫩大学生国内精品| 亚洲乱码中文字幕| 热re99久久精品国99热蜜月| 91精品国产综合久久久久久| 精品一区二区影视| 2023国产精品| 亚洲少妇久久久| 黄色网页在线播放| 一区二区在线免费观看| 欧美激情视频一区| 欧美日韩精品二区| 国产精品无码乱伦| 日日夜夜免费精品| 青青草手机视频在线观看| 亚洲调教欧美在线| 日韩二区三区在线观看| 亚洲色婷婷综合开心网| 欧美午夜a级限制福利片| 88久久精品无码一区二区毛片| h片免费观看| 日韩亚洲欧美中文在线| 成人av婷婷| 亚洲精品成人精品456| 综合自拍亚洲综合图不卡区| 国产日韩精品一区| 精品国产一区二区国模嫣然| 中文字幕精品视频| 日韩欧美aaaaaa| 国产亚洲精品久久久久久无几年桃| 欧美精品免费观看二区| 欧洲成人性视频| 精品成人私密视频| 99久久国产宗和精品1上映| 5566中文字幕一区二区| 欧美日韩爆操| 亚洲妇熟xx妇色黄| 在线观看欧美亚洲| 欧美精品国产精品久久久| 欧美激情一区二区三区在线| 欧美久久一级| 日韩在线免费观看视频| 91福利社在线观看| 国产高潮免费视频| 狠狠色噜噜狠狠狠狠97| 免费在线观看a视频| www 成人av com| 一区在线观看免费| 麻豆精品一区二区综合av| 日本一区二区三区四区在线视频| 精品人妻一区二区三区浪潮在线| 久久久久久久久蜜桃| 欧美另类极限扩张| 欧美色图俺去了| 日韩三区视频| 亚洲午夜精品久久久| 国产精品久久久久久久久久免费| 欧美一级片一区| 日韩中文字幕第一页| 色婷婷一区二区三区| 大桥未久恸哭の女教师| 精品日本一线二线三线不卡| 天堂中文字幕| 亚洲少妇中文在线| 欧美激情中文字幕| 国产精品国产对白熟妇| a在线欧美一区| 国产一二三四在线视频| 红桃一区二区三区| 欧美xxxhd| 久久久亚洲天堂| 四虎永久在线高清国产精品| 国产精品女主播一区二区三区| 日本激情视频网| 欧美bbbxxxxx| 好吊操这里只有精品| 182在线观看视频| 日韩一级在线视频| 免费观看日韩av| 日韩性小视频| 伊人久久亚洲影院| 99精品视频99| 国产一区二区日韩精品| 成人高清视频在线观看| 在线观看视频h| 狠狠躁夜夜躁人人爽天天高潮| 禁果av一区二区三区| 欧美色电影在线| 色先锋av资源| 色综合久久久无码中文字幕波多| 欧美视频成人| 国产一区二区成人| 中文在线www| 国产成人综合亚洲91猫咪| 成人av地址| 在线免费av资源| 中文一区一区三区免费在线观看| 欧美亚洲色综久久精品国产| 写真片福利在线播放| 懂色av一区二区三区免费观看| 日本亚洲最大的色成网站www| av毛片在线免费| 色8久久精品久久久久久蜜| 日韩中文字幕一区二区| 成人午夜激情视频| 国模杨依粉嫩蝴蝶150p| 91青青国产在线观看精品| 欧日韩不卡视频| 欧美性xxxxx极品视频| 91丨九色porny丨蝌蚪| 亚洲成人免费观看| 国产91精品久久久久| 国产97在线|日韩| 欧美劲爆第一页| 久久婷婷开心| 欧美视频免费一区二区三区| 国产乱码精品一区二区三区四区| 国产日韩中文字幕| 99久免费精品视频在线观78| 亚洲欧美日韩不卡一区二区三区| 手机视频在线观看| 精品国产鲁一鲁一区二区张丽| av片在线观看| 国产亚洲一区二区三区不卡| 欧洲精品久久一区二区| 午夜男人的天堂| 欧美日韩一区二区综合| 国语自产精品视频在线看抢先版结局| 国产一二三四五| 欧美丰满艳妇bbwbbw| 免费在线亚洲欧美| 国产午夜伦鲁鲁| 久久久久久香蕉网| 一级黄色大片免费| 国产午夜精品全部视频在线播放| 久久只有精品| 蝌蚪视频在线播放| 性xxxx丰满孕妇xxxx另类| 可以免费看黄色的网站| 国内自拍视频在线播放| 日韩高清一区在线| 88av看到爽| 国产7777777| 久久成人免费| 亚洲男人天堂视频| www.亚洲国产| 91ts人妖另类精品系列| wwww国产精品欧美| 爱情岛亚洲播放路线| 亚洲色在线视频| 男女啪啪免费体验区| 亚洲成人你懂的| 午夜精品免费在线| 亚洲国产视频二区| 亚洲一二区在线| 性欧美长视频免费观看不卡| 午夜精品一区二区三区在线视| 污污视频免费看| 成人精品在线播放| 欧美女人天堂| 欧美日韩国产精品专区| 岛国片av在线| 伊人电影在线观看| 国产成人精品影视| 免费在线观看日韩av| 激情婷婷综合| 可以看污的网站| 激情综合久久| avtt天堂资源网站| 国产喷水福利在线视频| 精品久久99| 福利视频免费在线观看| 久久国产精品久久精品国产| 欧美一站二站| 最近2019免费中文字幕视频三| julia京香一区二区三区| 国产亚洲日本欧美韩国| 免费网站www在线观看| 亚洲国产精久久久久久| 亚洲精品xxxxx| 日韩欧美一区二区久久婷婷| 国产视频一区二区| 国产精品精品软件视频| 日韩电影不卡一区| 三年中国中文观看免费播放| 天天影视欧美综合在线观看| 国产乡下妇女做爰| 亚洲性猛交xxxx乱大交| 成年网在线观看免费观看网址| 国产日韩三级| 久久久久久久综合日本| 激情六月天婷婷| t66y永久入口地址| 国产精品77777竹菊影视小说| 欧美精品videossex性护士| 日韩免费观看一区二区| 久久国产精品一区二区三区四区| 一区二区电影网| 亚洲视频精选在线| 欧美综合自拍| 亚洲精品成人av| 久久免费美女视频| 一区二区三区美女| 国产婷婷一区二区三区| 国产69精品一区二区亚洲孕妇| 青青草国产精品| 国产福利小视频| 成人春色激情网| gogo久久日韩裸体艺术| 深夜福利亚洲导航| 国产日韩精品视频| 毛片网站大全| 91a在线视频| 手机看片福利永久| 精品电影在线观看| 亚洲免费网站在线观看| 亚洲精选一区二区| 免费欧美一级视频| 天天影视色香欲综合网老头| 亚洲欧洲黄色网| 欧美精品一区在线播放| 国产网站一区二区| 日本韩国欧美在线观看| 黄色片在线看| 国产福利资源在线| 欧美性感一类影片在线播放| 色欧美88888久久久久久影院| 老鸭窝亚洲一区二区三区| av网站在线播放| 久久99九九| se视频在线观看| 欧美日韩精品一区二区三区蜜桃| 久久国产精品免费一区二区三区| 群体交乱之放荡娇妻一区二区| 精品乱码亚洲一区二区不卡| 99九九99九九九视频精品| 中文字幕亚洲成人| 亚洲乱码国产乱码精品精大量| 亚洲老女人av| ...av二区三区久久精品| 538在线一区二区精品国产| 九九国产精品视频| 懂色av中文字幕| 亚洲不卡1卡2卡三卡2021麻豆| 亚洲欧美在线aaa| 欧美视频不卡| 亚洲资源在线播放| 亚洲精品在线看| 国产内射老熟女aaaa∵| 国产v综合v| 日韩精品在线电影| a级女人18毛片| 午夜精品国产| 欧美日韩在线视频免费观看| 国产日韩欧美一区二区| 欧美久久一区二区三区| 国产日韩欧美在线视频观看| 欧美另类久久久品| 在线看片地址| 999精品免费视频| 国产精品免费观看视频| 国产十六处破外女视频| 日本久久久久久久久久久| 国产精品欧美一区二区三区不卡| 欧美一级黄视频| 欧美成人精品一区二区三区| 亚洲伦乱视频| 欧美momandson| 色婷婷av一区二区三区在线观看| 亚洲高清在线观看视频| 久久久久香蕉视频| 伊人久久大香线蕉无限次| 国产精品剧情一区二区在线观看| 午夜精品免费在线观看| 欧美成人精品一区二区综合免费| 首播影院在线观看免费观看电视| 欧美三级伦理在线| 欧美一级淫片免费视频黄| 头脑特工队2免费完整版在线观看| 啦啦啦中文在线观看日本| 午夜精品久久久久久久91蜜桃| 免费动漫网站在线观看| 欧美黑人经典片免费观看| 色狠狠色噜噜噜综合网| 午夜精品一区二区三区视频免费看| 91亚洲国产成人久久精品网站| av 日韩 人妻 黑人 综合 无码| 精品欧美日韩在线| 亚洲国产一区二区三区高清| 三级网站在线播放| 国产在线观看免费播放| av中文字幕一区| 成人毛片免费看| 国产精品久久久久久久小唯西川| 飘雪影视在线观看免费观看| bt电影在线| 99久久免费精品国产72精品九九| 91香蕉视频导航| 国产探花一区| 天堂社区 天堂综合网 天堂资源最新版| 天天干天天草天天| 午夜久久美女| 亚洲国产精品18久久久久久| 超碰成人在线播放| 亚洲国产一区二区在线播放| 成年人午夜剧场| 久草视频免费在线观看| 国产精品久久久久久9999| 国产精品玖玖玖在线资源| 一起操在线视频|