Visitor Design Pattern은 객체 구조에서 알고리즘을 분리하는 방법을 제공한다. 이 분리 방법은 실제적으로 객체 구조를 변경하지 않고 객체 구조에 새로운 작업을 추가하는 능력의 결과를 가져온다.
using System;
using System.Collections.Generic;
using System.Text;
namespace VistorPatternExample
{
public interface IVisitor
{
void visit(Wheel wheel);
void visit(Engine engine);
void visit(Body body);
void visit(Car car);
}
public interface IVisitable
{
void accept(IVisitor visitor);
}
public class Wheel : IVisitable
{
private string _Name;
public string Name
{
get
{
return this._Name;
}
}
public Wheel(string Name)
{
this._Name = Name;
}
#region IVisitable 멤버
public void accept(IVisitor visitor)
{
visitor.visit(this);
}
#endregion
}
public class Engine : IVisitable
{
#region IVisitable 멤버
public void accept(IVisitor visitor)
{
visitor.visit(this);
}
#endregion
}
public class Body : IVisitable
{
#region IVisitable 멤버
public void accept(IVisitor visitor)
{
visitor.visit(this);
}
#endregion
}
public class Car : IVisitable
{
private Engine _Engine = new Engine();
private Body _Body = new Body();
private Wheel[] _Wheels = new Wheel[]
{
new Wheel("front left"),
new Wheel("front right"),
new Wheel("back left"),
new Wheel("back right"),
};
public Engine Engine
{
get
{
return this._Engine;
}
}
public Body Body
{
get
{
return this._Body;
}
}
public Wheel[] Wheels
{
get
{
return this._Wheels;
}
}
#region IVisitable 멤버
public void accept(IVisitor visitor)
{
visitor.visit(this);
this._Engine.accept(visitor);
this._Body.accept(visitor);
foreach(Wheel wheel in this._Wheels)
{
wheel.accept(visitor);
}
}
#endregion
}
public class PrintVisitor : IVisitor
{
#region IVisitor 멤버
public void visit(Wheel wheel)
{
System.Console.WriteLine("Visiting " + wheel.Name + " wheel");
}
public void visit(Engine engine)
{
System.Console.WriteLine("Visiting engine");
}
public void visit(Body body)
{
System.Console.WriteLine("Visiting body");
}
public void visit(Car car)
{
System.Console.WriteLine("Visiting car");
}
#endregion
}
public class DoVisitor : IVisitor
{
#region IVisitor 멤버
public void visit(Wheel wheel)
{
System.Console.WriteLine("Steering my wheel");
}
public void visit(Engine engine)
{
System.Console.WriteLine("Starting my engine");
}
public void visit(Body body)
{
System.Console.WriteLine("Moving my body");
}
public void visit(Car car)
{
System.Console.WriteLine("Vroom!");
}
#endregion
}
class Program
{
static void Main(string[] args)
{
Car car = new Car();
IVisitor visitor = new PrintVisitor();
IVisitor doVisitor = new DoVisitor();
car.accept(visitor);
car.accept(doVisitor);
}
}
}




Leave your greetings here.