Visitor Pattern

1 분 소요


1. 비지터 패턴(Visitor Pattern)이란?

Visitor의 사전적 해석 : 방문객

알고리즘과 객체구조를 분리시키는 디자인 패턴.



2. 비지터 패턴의 역할

1) UML

VisitorUML


2) 역할

데이터를 저장하는 Element와 알고리즘을 저장하는 visitor을 분리시킨다. visitor에 따라 여러 기능을 수행할 수 있다.


3. 문제

1) 문제

ComputerPart(데이터),computerPartVisitor(알고리즘) interface를 각각 생성하고 각 클래스를 연결시켜보자.

2) UML

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.

# 참조 사이트

댓글남기기