๋ฐฉ๋ฌธ์

- ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋์๋ค๋๋ฉฐ ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ
 - ์๊ณ ๋ฆฌ์ฆ์ ์ด ํจํด์ ์ฌ์ฉํ๋ ํ ๊ฐ์ฒด ๊ตฌ์กฐ์์ ๋ถ๋ฆฌ ์ํค๋ ๋ฐฉ๋ฒ
 - ๊ตฌ์กฐ์ ์์  ์์ด ์๋ก์ด ๋์์ ๊ธฐ์กด ๊ฐ์ฒด ๊ตฌ์กฐ์ ์ถ๊ฐ ๊ฐ๋ฅ
 
interface CarElementVisitor {
    void visit(Wheel wheel);
    void visit(Engine engine);
    void visit(Body body);
    void visit(Car car);
}
interface CarElement {
  void accept(CarElementVisitor visitor);
}
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 Car() {
    this.elements = new CarElements[] {
      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 elem : elements) {
      elem.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) {
    CarElement car = new Car();
    car.accept(new CarElementPrintVisitor());
    car.accept(new CarElementDoVisitor());
  }
}