안녕하세요. 명월입니다.
이 글은 방문자 패턴에 대한 설명입니다.
방문자 패턴은 말 그대로 여러 객체를 모아 둔 List에 방문자 클래스를 넣으므로 일괄적으로 처리하게 하는 패턴입니다. 예전에 책에서 본 예제로 가게에 요리사, 홀 서빙, 카운터를 배치시키고 손님이 와서 돈을 내면 그 수익의 분할하는 패턴이라고 쓴 글을 본 적이 있습니다.
정말 말 그래도 딱 적절한 예이지 않을까 싶네요.
방문자 패턴은 말은 방문자 패턴인데 실제로는 MVC에서 Model과 Controller의 관계이지 않을까 싶습니다. 데이터 Model이 준비가 완료되면 최종적으로 Controller 선언해서 그 Model를 일괄 처리하는 방식의 패턴입니다.
Copy! [소스 보기] interface IVisitor { void Visit(Model1 model); void Visit(Model2 model); void Visit(Model3 model); } interface Model { void Accept(IVisitor visitor); } class Model1 : Model { public String Data { get; set; } public Model1() { Data = "Model1"; } // 방문자 클래스가 Accept되면 방문자 클래스에 자기 자신을 등록한다. public void Accept(IVisitor visitor) { visitor.Visit(this); } } class Model2 : Model { public String Data { get; set; } public Model2() { Data = "Model2"; } // 방문자 클래스가 Accept되면 방문자 클래스에 자기 자신을 등록한다. public void Accept(IVisitor visitor) { visitor.Visit(this); } } class Model3 : Model { public String Data { get; set; } public Model3() { Data = "Model3"; } // 방문자 클래스가 Accept되면 방문자 클래스에 자기 자신을 등록한다. public void Accept(IVisitor visitor) { visitor.Visit(this); } } class Controller : IVisitor { // Model1 이 있을 때 호출 public void Visit(Model1 model) { Console.WriteLine(model.Data); } // Model2 이 있을 때 호출 public void Visit(Model2 model) { Console.WriteLine(model.Data); } // Model3 이 있을 때 호출 public void Visit(Model3 model) { Console.WriteLine(model.Data); } } class Route : List<Model> { public void Accept(IVisitor visitor) { foreach(var model in this) { model.Accept(visitor); } } } class Program { static void Main(string[] args) { var route = new Route(); route.Add(new Model1()); route.Add(new Model2()); route.Add(new Model3()); // 결과 Model1 \n Model2 \n Model3 route.Accept(new Controller()); Console.WriteLine("Press any key..."); Console.ReadKey(); } }
위 소스를 보면 route클래스에 Model를 선언합니다. 그리고 최종적으로 Controller를 선언해서 Accept함수를 호출해서 결과를 얻는 형태입니다.
여기까지 방문자 패턴에 대한 설명이었습니다.
궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.
광고
광고
'Study > Design Pattern' 카테고리의 다른 글
[Design pattern - 실무편] Log manager (로그 매니저)에서 책임 체인 패턴 사용하기 (0) | 2019.06.17 |
---|---|
[Design pattern - 실무편] Controller에서 Facade 패턴 사용하기 (0) | 2019.06.14 |
[Design pattern - 실무편] Excel 빌더 패턴 만들기 (0) | 2019.06.13 |
[Design pattern - 실무편] FactoryDao 예제 ※ DI(의존성 주입) 구현 예제 (0) | 2019.06.12 |
[Design pattern] 템플렛 메서드 패턴 (Template method pattern) (0) | 2019.06.12 |
[Design pattern] 옵서버 패턴 (Observer pattern) (0) | 2019.06.11 |
[Design pattern] 중재자 패턴 (Mediator pattern) (0) | 2019.06.10 |
[Design pattern] 인터프리트 패턴(Interpret pattern) (※스택 계산기 예제) (0) | 2019.06.10 |