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