비지터 패턴

LePUS3에서의 비지터]] 객체 지향 프로그래밍과 소프트웨어 공학에서 **비지터** 패턴(visitor pattern; 방문자 패턴)은 알고리즘을 객체 구조에서 분리시키는 디자인 패턴이다. 이렇게 분리를 하면 구조를 수정하지 않고도 실질적으로 새로운 동작을 기존의 객체 구조에 추가할 수 있게 된다. 개방-폐쇄 원칙을 적용하는 방법의 하나이다.
# 구조

## UML 클래스 및 시퀀스 다이어그램
accessdate=2017-08-12
## 클래스 다이어그램
LePUS3의 비지터 (범례)]]
# 예제

## C++
#include #include using namespace std; // 1. Add an accept(Visitor) method to the "element" hierarchy class Element { public: virtual void accept(class Visitor &v;) = 0; }; class This: public Element { public: /*virtual*/void accept(Visitor &v;); string this() { return "This"; } }; class That: public Element { public: /*virtual*/void accept(Visitor &v;); string that() { return "That"; } }; class TheOther: public Element { public: /*virtual*/void accept(Visitor &v;); string theOther() { return "TheOther"; } }; // 2. Create a "visitor" base class w/ a visit() method for every "element" type class Visitor { public: virtual void visit(This *e) = 0; virtual void visit(That *e) = 0; virtual void visit(TheOther *e) = 0; }; /*virtual*/void This::accept(Visitor &v;) { v.visit(this); } /*virtual*/void That::accept(Visitor &v;) { v.visit(this); } /*virtual*/void TheOther::accept(Visitor &v;) { v.visit(this); } // 3. Create a "visitor" derived class for each "operation" to do on "elements" class UpVisitor: public Visitor { /*virtual*/void visit(This *e) { cout this() that() theOther() this() that() theOther() accept(up); // to accept() calls for (i = 0; i accept(down); } // OUTPUT // // do Up on This // do Up on That // do Up on TheOther // do Down on This // do Down on That // do Down on TheOther
## 자바
interface CarElementVisitor { void visit(Wheel wheel); void visit(Engine engine); void visit(Body body); void visit(Car car); } interface CarElement { void accept(CarElementVisitor visitor); // CarElements have to provide accept(). } class Wheel implements CarElement { private String name; public Wheel(String name) { this.name = name; } public String getName() { return this.name; } public void accept(CarElementVisitor visitor) { visitor.visit(this); } } class Engine implements CarElement { public void accept(CarElementVisitor visitor) { visitor.visit(this); } } class Body implements CarElement { public void accept(CarElementVisitor visitor) { visitor.visit(this); } } class Car implements CarElement{ CarElement[] elements; public CarElement[] getElements() { return elements.clone(); // Return a copy of the array of references. } public Car() { this.elements = new CarElement[] { new Wheel("front left"), new Wheel("front right"), new Wheel("back left") , new Wheel("back right"), new Body(), new Engine() }; } public void accept(CarElementVisitor visitor) { for(CarElement element : this.getElements()) { element.accept(visitor); } visitor.visit(this); } } class CarElementPrintVisitor implements CarElementVisitor { public void visit(Wheel wheel) { System.out.println("Visiting "+ wheel.getName() \+ " wheel"); } public void visit(Engine engine) { System.out.println("Visiting engine"); } public void visit(Body body) { System.out.println("Visiting body"); } public void visit(Car car) { System.out.println("Visiting car"); } } class CarElementDoVisitor implements CarElementVisitor { public void visit(Wheel wheel) { System.out.println("Kicking my "+ wheel.getName() + " wheel"); } public void visit(Engine engine) { System.out.println("Starting my engine"); } public void visit(Body body) { System.out.println("Moving my body"); } public void visit(Car car) { System.out.println("Starting my car"); } } public class VisitorDemo { static public void main(String[] args){ Car car = new Car(); car.accept(new CarElementPrintVisitor()); car.accept(new CarElementDoVisitor()); } }