基于设计模式的学习之旅-----访问者模式(附源码)
基于設(shè)計(jì)模式的學(xué)習(xí)之旅-----訪問者模式
1、初始訪問者模式
2、什么是訪問者模式
表示一個作用于某對象結(jié)構(gòu)中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。
3、模式結(jié)構(gòu)圖
4、模式代碼事例
場景:年會,每個小組表演節(jié)目
4、1涉及到的類,以及類圖
ITeam、IVisitor、CompanyObjectStructure、StudioTeam、ServerTeam、AnnualVisitor
4、2具體的代碼實(shí)現(xiàn)
使用訪問者模式:
ITeam
StudioTeam
IVisitor
AnnualVisitor
CompanyObjectStructure
PatternRun
?
非訪問者模式實(shí)現(xiàn):
AnnualCompany
NoPatternRun
4、3事例輸出結(jié)果
5、模式參與者
Vi?s?i?t?o?r(訪問者,如IVisitor)
C?o?n?c?r?e?t?e?Vi?s?i?t?o?r(具體訪問者,如AnnualVisitor、MidAutumnVisitor)
E?l?e?m?e?n?t(元素,如ITeam)
C?o?n?c?r?e?t?e?E?l?e?m?e?n?t(具體元素,如ServerTeam?)
O?b?j?e?c?t?S?t?r?u?c?t?u?r?e(對象結(jié)構(gòu),如CompanyObjectStructure)
6、模式優(yōu)缺點(diǎn)
A、訪問者模式使得易于增加新的操作。?訪問者使得增加依賴于復(fù)雜對象結(jié)構(gòu)的構(gòu)件的操作變得容易了。僅需增加一個新的訪問者即可在一個對象結(jié)構(gòu)上定義一個新的操作。相反,如果每個功能都分散在多個類之上的話,定義新的操作時(shí)必須修改每一類。
B、訪問者集中相關(guān)的操作而分離無關(guān)的操作。相關(guān)的行為不是分布在定義該對象結(jié)構(gòu)的各個類上,而是集中在一個訪問者中。無關(guān)行為卻被分別放在它們各自的訪問者子類中。這就既簡化了這些元素的類,也簡化了在這些訪問者中定義的算法。所有與它的算法相關(guān)的數(shù)據(jù)結(jié)構(gòu)都可以被隱藏在訪問者中。
C、增加新的C?o?n?c?r?e?t?e?E?l?e?m?e?n?t類很困難。Vi?s?i?t?o?r模式使得難以增加新的E?l?e?m?e?n?t的子類。每添加一個新的?C?o?n?c?r?e?t?e?E?l?e?m?e?n?t都要在?Vi?s?t?o?r中添加一個新的抽象操作,并在每一個C?o?n?c?r?e?t?Vi?s?i?t?o?r類中實(shí)現(xiàn)相應(yīng)的操作。
D、通過類層次進(jìn)行訪問。一個迭代器(參見I?t?e?r?a?t?o?r(5?.?4)?)可以通過調(diào)用節(jié)點(diǎn)對象的特定操作來遍歷整個對象結(jié)構(gòu),同時(shí)訪問這些對象。但是迭代器不能對具有不同元素類型的對象結(jié)構(gòu)進(jìn)行操作。
E、累積狀態(tài)。當(dāng)訪問者訪問對象結(jié)構(gòu)中的每一個元素時(shí),它可能會累積狀態(tài)。
F、破壞封裝。訪問者方法假定C?o?n?c?r?e?t?e?E?l?e?m?e?n?t接口的功能足夠強(qiáng),足以讓訪問者進(jìn)行它們的工作。結(jié)果是,該模式常常迫使你提供訪問元素內(nèi)部狀態(tài)的公共操作,這可能會破壞它的封裝性。
7、模式適用性
A、一個對象結(jié)構(gòu)包含很多類對象,它們有不同的接口,而你想對這些對象實(shí)施一些依賴于其具體類的操作。
B、需要對一個對象結(jié)構(gòu)中的對象進(jìn)行很多不同的并且不相關(guān)的操作,而你想避免讓這些操作“污染”這些對象的類。?Vi?s?i?t?o?r使得你可以將相關(guān)的操作集中起來定義在一個類中。當(dāng)該對象結(jié)構(gòu)被很多應(yīng)用共享時(shí),用Vi?s?i?t?o?r模式讓每個應(yīng)用僅包含需要用到的操作。
C、定義對象結(jié)構(gòu)的類很少改變,但經(jīng)常需要在此結(jié)構(gòu)上定義新的操作。改變對象結(jié)構(gòu)類需要重定義對所有訪問者的接口,這可能需要很大的代價(jià)。如果對象結(jié)構(gòu)類經(jīng)常改變,那么可能還是在這些類中定義這些操作較好。
?
點(diǎn)擊下載“文檔以及源碼下載”
?
歡迎轉(zhuǎn)載,請注明出處“http://www.cnblogs.com/luxiaofeng54/archive/2013/04/13/3019434.html”
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/luxiaofeng54/archive/2013/04/13/3019434.html
總結(jié)
以上是生活随笔為你收集整理的基于设计模式的学习之旅-----访问者模式(附源码)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 酒量不好的人喝一瓶黑方会怎么样,特别是我
- 下一篇: 《帝企鹅日记》观后感