
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace ConsoleApplication1
- {
- abstract class Element
- {
- public abstract void Accept(Visitor v);
- }
- class Elem1 : Element
- {
- public override void Accept(Visitor v)
- {
- v.VisitElem1(this);
- }
- }
- class Elem2 : Element
- {
- public override void Accept(Visitor v)
- {
- v.VisitElem2(this);
- }
- }
- abstract class Visitor
- {
- public abstract void VisitElem1(Elem1 e1);
- public abstract void VisitElem2(Elem2 e2);
- }
- class Visitor1 : Visitor
- {
- public override void VisitElem1(Elem1 e1)
- {
- Console.WriteLine(this.GetType().Name + " " + e1.GetType().Name);
- }
- public override void VisitElem2(Elem2 e2)
- {
- Console.WriteLine(this.GetType().Name + " " + e2.GetType().Name);
- }
- }
- class Visitor2 : Visitor
- {
- public override void VisitElem1(Elem1 e1)
- {
- Console.WriteLine(this.GetType().Name + " " + e1.GetType().Name);
- }
- public override void VisitElem2(Elem2 e2)
- {
- Console.WriteLine(this.GetType().Name + " " + e2.GetType().Name);
- }
- }
- class ObjStructure
- {
- private List<Element> elems = new List<Element>();
- public void add(Element e)
- {
- elems.Add(e);
- }
- public void visit(Visitor v)
- {
- foreach (Element e in elems)
- {
- e.Accept(v);
- }
- }
- }
- class Client
- {
- public static void Main()
- {
- ObjStructure o = new ObjStructure();
- o.add(new Elem1());
- o.add(new Elem2());
- o.visit(new Visitor1());
- o.visit(new Visitor2());
- Console.Read();
- }
- }
- }