방문자 모드


Visitor Pattern에서는 요소 클래스의 실행 알고리즘을 변경하는 Visitor 클래스를 사용합니다. 이러한 방식으로 방문자가 변경됨에 따라 요소의 실행 알고리즘이 변경될 수 있습니다. 이러한 유형의 디자인 패턴은 행동 패턴입니다. 스키마에 따르면 방문자 개체가 요소 개체에 대한 작업을 처리할 수 있도록 요소 개체가 방문자 개체를 수락했습니다.

소개

의도: 주로 데이터 구조와 데이터 작업을 분리합니다.

주로 해결되는 문제: 안정적인 데이터 구조 및 불안정한 연산 결합 문제.

사용 시기: 객체 구조의 객체에 대해 서로 다른 다양한 작업을 수행해야 하며 이러한 작업이 이러한 객체의 클래스를 "오염"시키는 것을 방지해야 합니다. 방문자 패턴을 사용하여 이를 캡슐화합니다. 수업.

해결 방법: 방문한 수업에서 방문자를 받을 수 있도록 외부 인터페이스를 추가합니다.

키 코드: 데이터베이스 클래스에는 방문자를 수락하고 자체 참조를 방문자에게 전달하는 메서드가 있습니다.

적용 예: 당신은 친구 집에 손님이고, 당신은 방문자이며, 친구가 당신의 방문을 수락하고, 친구의 설명을 전달한 다음, 친구의 설명을 판단하는 것이 방문자 모드입니다.

장점: 1. 단일 책임 원칙을 준수합니다. 2. 확장성이 뛰어납니다. 3. 유연성.

단점: 1. 특정 요소는 방문자에게 세부 정보를 공개하므로 Dimit 원칙을 위반합니다. 2. 특정 요소를 변경하는 것은 어렵습니다. 3. 종속성 반전 원칙을 위반하고 추상화 대신 구체적인 클래스에 의존합니다.

사용 시나리오: 1. 객체 구조의 객체에 해당하는 클래스는 거의 변경되지 않지만 이 객체 구조에 대한 새로운 작업을 정의해야 하는 경우가 많습니다. 2. 객체 구조의 객체에 대해 다양하고 관련되지 않은 작업을 수행해야 하며 이러한 작업이 이러한 객체의 클래스를 "오염"시키는 것을 방지해야 하며 새 작업을 추가할 때 이러한 클래스를 수정하고 싶지 않습니다.

참고: 방문자는 기능을 통합하고 보고서, UI, 인터셉터 및 필터를 만들 수 있습니다.

Implementation

허용된 작업을 정의하는 ComputerPart 인터페이스를 만듭니다. Keyboard, Mouse, MonitorComputerComputerPart 인터페이스를 구현하는 엔터티 클래스입니다. 방문자 클래스의 작업을 정의하는 또 다른 인터페이스 ComputerPartVisitor를 정의하겠습니다. 컴퓨터 엔터티 방문자를 사용하여 해당 작업을 수행합니다.

VisitorPatternDemo, 데모 클래스에서는 Computer, ComputerPartVisitor 클래스를 사용하여 방문자 패턴의 사용법을 보여줍니다.

visitor_pattern_uml_diagram.jpg

1단계

요소를 나타내는 인터페이스를 정의합니다.

ComputerPart.java

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

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

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

5단계

ComputerPartDisplayVisitor를 사용하여 Computer의 구성 요소를 표시합니다.

VisitorPatternDemo.java

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

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

6단계

출력을 확인합니다.

rreee