[행위 패턴] Visitor pattern (비지터 패턴)


다양한 객체에 새로운 기능을 추가해야 하는데 캡슐화가 별로 중요하지 않은 경우

 

(원본 출처 : https://www.tutorialspoint.com/design_pattern/design_pattern_quick_guide.htm)

 

Visitor 패턴에서는 요소 클래스의 실행 알고리즘을 변경하는 visitor 클래스를 사용합니다. 이러한 방식으로, 요소의 실행 알고리즘은 방문자가 다양 할 때 달라질 수 있습니다. 이 패턴은 행동 패턴 카테고리에 포함됩니다. 패턴에 따라 요소 객체는 방문자 객체가 요소 객체에 대한 작업을 처리하도록 방문자 객체를 받아 들여야합니다.

 

Implementation

Accept opearation을 정의하는 ComputerPart 인터페이스를 만들겠습니다. 키보드, 마우스, 모니터 및 컴퓨터는 ComputerPart 인터페이스를 구현하는 구체적인 클래스입니다. 방문자 클래스 작업을 정의 할 다른 인터페이스 인 ComputerPartVisitor를 정의 할 것입니다. 컴퓨터는 구체적인 방문자를 사용하여 해당 작업을 수행합니다.

VisitorPatternDemo, 우리 데모 클래스는 Computer, ComputerPartVisitor 클래스를 사용하여 방문자 패턴의 사용을 시연합니다.

Visitor Pattern UML Diagram

Step 1

요소를 나타내는 인터페이스를 정의하십시오.

 

 

ComputerPart.java

public interface class ComputerPart {
   public void accept(ComputerPartVisitor computerPartVisitor);
}

Step 2

위의 클래스를 확장하는 구체적인 클래스를 만듭니다.

 

Keyboard.java

public class Keyboard  implements ComputerPart {

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

Monitor.java

public class Monitor  implements ComputerPart {

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

Mouse.java

public class Mouse  implements ComputerPart {

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

Computer.java

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);
   }
}

Step 3

방문자를 나타내는 인터페이스를 정의하십시오.

 

 

 

ComputerPartVisitor.java

public interface ComputerPartVisitor {
	public void visit(Computer computer);
	public void visit(Mouse mouse);
	public void visit(Keyboard keyboard);
	public void visit(Monitor monitor);
}

Step 4

위의 클래스를 구현하는 구체적인 방문자를 만듭니다.

ComputerPartDisplayVisitor.java

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.");
   }
}

Step 5

컴퓨터 파트를 표시하려면 ComputerPartDisplayVisitor를 사용하십시오.

 

VisitorPatternDemo.java

public class VisitorPatternDemo {
   public static void main(String[] args) {

      ComputerPart computer = new Computer();
      computer.accept(new ComputerPartDisplayVisitor());
   }
}

Step 6

결과를 확인합니다.

Displaying Mouse.
Displaying Keyboard.
Displaying Monitor.
Displaying Computer.
Posted by kunoo
,