Visitor Pattern
1. 비지터 패턴(Visitor Pattern)이란?
Visitor의 사전적 해석 : 방문객
알고리즘과 객체구조를 분리
시키는 디자인 패턴.
2. 비지터 패턴의 역할
1) UML
2) 역할
데이터를 저장하는 Element와 알고리즘을 저장하는 visitor을 분리시킨다. visitor에 따라 여러 기능을 수행할 수 있다.
3. 문제
1) 문제
ComputerPart(데이터),computerPartVisitor(알고리즘) interface를 각각 생성하고 각 클래스를 연결시켜보자.
2) UML
3) 역할
위 UML를 참조하여 아래 여덟 개의 클래스 및 인터페이스를 구현해보아라.
● ComputerPart 인터페이스 - computerPartVisitor를 매개변수로 포함하는 accept함수를 갖고있다.(data)
● ComputerPartVisitor 인터페이스 - data 각각의 매개변수를 이용하여 다수의 visit함수를 갖고있다. (algorithm)
Computer,Keyboard,Monitor,Mouse클래스는 데이터 클래스들로 visitor에게 자신을 던져주는 역할을 수행한다.
● Computer 클래스 - 생성자로 computerPart객체(computer,keyboard,monitor,mouse)를 생성해준다.
● Keyboard 클래스
● Monitor 클래스
● Mouse 클래스
● ComputerPartDisplayVisitor 클래스 - ComputerPartVisitor 인터페이스를 구현하는 구체적인 방문자를 만들어 display 알고리즘을 수행한다.
● VisitorPatternDemo 클래스 (main) - Computer 객체를 생성하고, 이를 Display 알고리즘을 수행한다.
4) 해답
ComputerPart.java
// data 인터페이스
public interface ComputerPart {
public void accept (ComputerPartVisitor computerPartVisitor);
}
ComputerPartVisitor.java
// visitor 인터페이스
public interface ComputerPartVisitor {
public void visit(Computer computer);
public void visit(Mouse mouse);
public void visit(Keyboard keyboard);
public void visit(Monitor monitor);
}
Computer.java
// 데이터 클래스들 ( visitor에게 자신을 던져줌으로써 끝 )
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);
}
}
Keyboard.java
public class Keyboard implements ComputerPart{
@Override
public void accept(ComputerPartVisitor computerPartVisitor) {
computerPartVisitor.visit(this);
}
}
Mouse.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);
}
}
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.");
}
}
VisitorPatternDemo.java
(main)
// client
public class VisitorPatternDemo {
public static void main(String[] args) {
ComputerPart computer = new Computer();
computer.accept(new ComputerPartDisplayVisitor());
}
}
▶︎ 출력
Displaying Mouse.
Displaying Keyboard.
Displaying Monitor.
Displaying Computer.
댓글남기기