模式設計c#--行為型--visitor
名稱 | Visitor |
結構 |
![]() |
意圖 | 表示一個作用于某對象結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作。 |
適用性 |
|

// Visitor pattern -- Structural example
|
using System;
using System.Collections; namespace DoFactory.GangOfFour.Visitor.Structural { ?? ??// MainApp test application ??class MainApp ??{ ????staticvoid Main() ????{ ??????// Setup structure ??????ObjectStructure o = new ObjectStructure(); ??????o.Attach(new ConcreteElementA()); ??????o.Attach(new ConcreteElementB()); ??????// Create visitor objects ??????ConcreteVisitor1 v1 = new ConcreteVisitor1(); ??????ConcreteVisitor2 v2 = new ConcreteVisitor2(); ??????// Structure accepting visitors ??????o.Accept(v1); ??????o.Accept(v2); ??????// Wait for user ??????Console.Read(); ????} ??} ??// "Visitor" ??abstractclass Visitor ??{ ????publicabstractvoid VisitConcreteElementA( ??????ConcreteElementA concreteElementA); ????publicabstractvoid VisitConcreteElementB( ??????ConcreteElementB concreteElementB); ??} ??// "ConcreteVisitor1" ??class ConcreteVisitor1 : Visitor ??{ ????publicoverridevoid VisitConcreteElementA( ??????ConcreteElementA concreteElementA) ????{ ??????Console.WriteLine("{0} visited by {1}", ????????concreteElementA.GetType().Name, this.GetType().Name); ????} ????publicoverridevoid VisitConcreteElementB( ??????ConcreteElementB concreteElementB) ????{ ??????Console.WriteLine("{0} visited by {1}", ????????concreteElementB.GetType().Name, this.GetType().Name); ????} ??} ??// "ConcreteVisitor2" ??class ConcreteVisitor2 : Visitor ??{ ????publicoverridevoid VisitConcreteElementA( ??????ConcreteElementA concreteElementA) ????{ ??????Console.WriteLine("{0} visited by {1}", ????????concreteElementA.GetType().Name, this.GetType().Name); ????} ????publicoverridevoid VisitConcreteElementB( ??????ConcreteElementB concreteElementB) ????{ ??????Console.WriteLine("{0} visited by {1}", ????????concreteElementB.GetType().Name, this.GetType().Name); ????} ??} ??// "Element" ??abstractclass Element ??{ ????publicabstractvoid Accept(Visitor visitor); ??} ??// "ConcreteElementA" ??class ConcreteElementA : Element ??{ ????publicoverridevoid Accept(Visitor visitor) ????{ ??????visitor.VisitConcreteElementA(this); ????} ????publicvoid OperationA() ????{ ????} ??} ??// "ConcreteElementB" ??class ConcreteElementB : Element ??{ ????publicoverridevoid Accept(Visitor visitor) ????{ ??????visitor.VisitConcreteElementB(this); ????} ????publicvoid OperationB() ????{ ????} ??} ??// "ObjectStructure" ??class ObjectStructure ??{ ????private ArrayList elements = new ArrayList(); ????publicvoid Attach(Element element) ????{ ??????elements.Add(element); ????} ????publicvoid Detach(Element element) ????{ ??????elements.Remove(element); ????} ????publicvoid Accept(Visitor visitor) ????{ ??????foreach (Element e in elements) ??????{ ????????e.Accept(visitor); ??????} ????} ??} } |

ConcreteElementA visited by ConcreteVisitor1
ConcreteElementB visited by ConcreteVisitor1 ConcreteElementA visited by ConcreteVisitor2 ConcreteElementB visited by ConcreteVisitor2 |
posted on 2006-01-03 16:18 夢在天涯 閱讀(1257) 評論(2) 編輯 收藏 引用 所屬分類: Design pattern