Java Design Pattern - Visitor Pattern

업데이트:

Design Pattern

  • 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여, 이후에 재이용하기 좋은 형태로 특정의 규약을 묶어서 정리한 것이다.
  • 디자인 패턴은 알고리즘이 아니라 상황에 따라 자주 쓰이는 설계 방법을 정리한 코딩 방법론일 뿐이며 모든 상황의 해결책이 아니다.

Behavioral Patterns, 행위 패턴

  • 객체간의 상호작용과 책임을 중시하는 패턴이다.
  • 한 객체가 혼자 수행할 수 없는 작업을 여러 개의 객체로 어떻게 분배하면서 객체 사이의 결합도를 최소화하는 것에 중점을 두는 패턴이다.

Visitor Pattern

  • 알고리즘을 객체 구조에서 분리시키는 패턴이다.

Example

public interface ComputerPartVisitor {

  public void visit(Computer computer);

  public void visit(Mouse mouse);

  public void visit(Keyboard keyboard);

  public void visit(Monitor monitor);

}
public class ComputerPartDisplayVisitor implements ComputerPartVisitor {

  @Override
  public void visit(Computer computer) {
    System.out.println("Displaying Computer.");
  }

  @Override
  public void visit(Mouse mouse) {
    System.out.println("Displaying Mouse.");
  }

  @Override
  public void visit(Keyboard keyboard) {
    System.out.println("Displaying Keyboard.");
  }

  @Override
  public void visit(Monitor monitor) {
    System.out.println("Displaying Monitor.");
  }

}
  • Computer를 장비 별로 분리하여 연결하기 위해 ComputerPartVisitor 인터페이스를 정의하고, 장비 별 연결 방식(알고리즘)을 정의할 ComputerPartDisplayVisitor 클래스를 구현한다.
public interface ComputerPart {

  public void accept(ComputerPartVisitor computerPartVisitor);

}
public class Keyboard implements ComputerPart {

  @Override
  public void accept(ComputerPartVisitor computerPartVisitor) {
    computerPartVisitor.visit(this);
  }

}
public class Monitor implements ComputerPart {

  @Override
  public void accept(ComputerPartVisitor computerPartVisitor) {
    computerPartVisitor.visit(this);
  }

}
public class Mouse implements ComputerPart {

  @Override
  public void accept(ComputerPartVisitor computerPartVisitor) {
    computerPartVisitor.visit(this);
  }

}
public class Computer implements ComputerPart {

  ComputerPart[] parts;

  public Computer() {
    parts = new ComputerPart[] { new Mouse(), new Keyboard(), new Monitor() };
  }

  @Override
  public void accept(ComputerPartVisitor computerPartVisitor) {
    for (int i = 0; i < parts.length; i++) {
      parts[i].accept(computerPartVisitor);
    }
    computerPartVisitor.visit(this);
  }

}
  • Computer를 각 장비 별로 구현하기 위한 ComputerPart 인터페이스를 정의한다.
  • 각 장비 별 연결하기 위해 ComputerPartVisitor의 visit 메서드를 호출하는 accept 메서드를 정의한다.
  • 각 장비 별 연결과 ComputerPartVisitor 객체에 자신을 연결하는 Computer 클래스를 구현한다.
public class VisitorPatternMain {

  public static void main(String[] args) {
    ComputerPart computer = new Computer();
    computer.accept(new ComputerPartDisplayVisitor());
  }

}

  • Computer 객체를 생성하여 새 ComputerPartDisplayVisitor 객체를 accept 메서드에 주입하여 수행 흐름을 확인한다.

Source

Sample Code는 여기에서 확인 가능합니다.

댓글남기기