資源描述:
《[23種設(shè)計模式匯總]行為型模式_訪問者模式》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、訪問者模式一、訪問者模式簡介(BriefIntroduction)表示一個作用于某對象結(jié)構(gòu)中的元素操作。它使你可以在不改變各元素類的前提下定義作用于這些元素的新操作,它把數(shù)據(jù)結(jié)構(gòu)和作用于結(jié)構(gòu)上的操作之間的耦合性解脫開,使的操作結(jié)合可以相對自由地演化。優(yōu)點是增加新的操作很容易,因為增加一個新的操作就意味著增加一個新的訪問者,訪問者模式將有關(guān)的行為集中到一個訪問對象中。二、解決的問題(WhatToSolve)??????訪問者模式的目的是要把處理從數(shù)據(jù)結(jié)構(gòu)分離出來。如果系統(tǒng)有比較穩(wěn)定的數(shù)據(jù)結(jié)構(gòu),又有易于變化的算法的話,使用訪問者模式是個不錯的選擇,因
2、為訪問者模式使的算法操作的增加變的容易。相反,如果系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)不穩(wěn)定,易于變化,則此系統(tǒng)就不適合使用訪問者模式了。三、訪問者模式分析(Analysis)1、訪問者模式結(jié)構(gòu)Visitor:為對象結(jié)構(gòu)中Element的每一個子類聲明一個Visitor操作。ConcreteVisitor1、ConcreteVisitor2:具體的訪問者,實現(xiàn)父類Visitor的操作。每個操作實現(xiàn)算法的一部分,而該算法片段仍是對應(yīng)與結(jié)構(gòu)中對象的類。ObjectStructure:枚舉它的元素,可以提供一個高層的接口以允許訪問者訪問它的元素。Element:定義一個Ac
3、cept操作,它以一個訪問者為參數(shù)。ConcreteElementA、ConcreteElementB:具體元素,實現(xiàn)父類Element的方法Accept。2、源代碼1、訪問者抽象類VisitorpublicabstractclassVisitor{publicabstractvoidVisitConcreteElementA(ConcreteElementAconcreteElementA);publicabstractvoidVisitConcreteElementB(ConcreteElementBconcreteElementB);}2、
4、具體訪問者ConcreteVisitor1、ConcreteVisitor2publicclassConcreteVisitor1:Visitor{publicoverridevoidVisitConcreteElementA(ConcreteElementAconcreteElementA){Console.WriteLine("{0}訪問{1}",this.GetType().Name,concreteElementA.GetType().Name);}publicoverridevoidVisitConcreteElementB(Concr
5、eteElementBconcreteElementB){Console.WriteLine("{0}訪問{1}",this.GetType().Name,concreteElementB.GetType().Name);}}publicclassConcreteVisitor2:Visitor{publicoverridevoidVisitConcreteElementA(ConcreteElementAconcreteElementA){Console.WriteLine("{0}訪問{1}",this.GetType().Name,conc
6、reteElementA.GetType().Name);}publicoverridevoidVisitConcreteElementB(ConcreteElementBconcreteElementB){Console.WriteLine("{0}訪問{1}",this.GetType().Name,concreteElementB.GetType().Name);}3、定義一個Accept操作,它以一個訪問者為參數(shù)publicabstractclassElement{publicabstractvoidAccept(Visitorvisit
7、or);}4、具體元素ConcreteElementA、ConcreteElementBpublicclassConcreteElementA:Element{publicoverridevoidAccept(Visitorvisitor){visitor.VisitConcreteElementA(this);}publicvoidOperationA(){}}publicclassConcreteElementB:Element{publicoverridevoidAccept(Visitorvisitor){visitor.VisitCon
8、creteElementB(this);}publicvoidOperationB(){}}5、對象結(jié)構(gòu)ObjectStructurep