[디자인패턴] visitor

한지연·2023년 2월 8일
0

Visitor Pattern

  • 객체가 가지는 기능들을 클래스로 분리
  • 클래스 구조 변화는 거의 없고 기능의 추가 삭제가 자주 발생할 때 사용하는 것이 좋음
  • 컴포지트 패턴과 함께 사용
  • 원래 객체지향의 캡슐화에 위배되는 패턴

  • Visitor: 기능을 구현한 클래스, 각 객체는 Visitorfmf accept하여 기능수행

code

  • Visitor
public abstract class Visitor {
    public abstract void visit(File file);
    public abstract void visit(Directory dir);
}
  • ConcreteVisitor
public class ListVisitor extends Visitor{
    private String currentDir = "/";

    @Override
    public void visit(File file) {
        System.out.println(currentDir + "/" + file);

    }

    @Override
    public void visit(Directory dir) {
        System.out.println(currentDir + "/" + dir);
        String saveDir = currentDir;
        currentDir = currentDir + "/" + dir.getName();
        Iterator<Entry> ir = dir.iterator();
        while(ir.hasNext()) {
            Entry entry = ir.next();
            entry.accept(this);
        }
        currentDir = saveDir;
    }
}
  • Element
public interface Accepter {
    public abstract void accept(Visitor v);
}
public abstract class Entry implements Accepter{
    public abstract String getName();
    public abstract int getSize();
    public Entry add(Entry entry){ return null;}
    public Iterator iterator() {return null;}

    @Override
    public String toString() {
        return getName() + "(" + getSize() + ")";
    }
}
  • concreteElementA
public class File extends Entry{

    private String name;
    private int size;

    public File(String name, int size) {
        this.name = name;
        this.size = size;
    }
    ...........
}    
  • concreteElementB
public class Directory extends Entry {
    private String name;
    private ArrayList<Entry> dir = new ArrayList<>();

    public Directory(String name) {
        this.name = name;
    }
    ...............
}    

장단점

장점
1. 개방폐쇄원칙 : 다른 클래스를 변경하지 않으면서 해당 클래스의 객체와 작동할 수 있는 새로운 행동(메서드)을 도입할 수 있음
2. 단일책임원칙: 같은 행동의 여러 버전을 같은 클래스로 이동할 수 있음 => Visitor
3. 다양한 객체들과 작업하면서 유용한 정보 축적 가능

단점
1. 클래스가 요소 계층구조에 추가되거나 제거 될 때마다 모든 비지터를 업데이트 해야함
2. 작업해야 하는 요소들의 비공개 필드 및 메서드들에 접근하기 위한 권한이 부족할 수 있음

출처

이 글은 인프런 박은종 강사님의 강의 내용을 정리하기 위하여 작성하였습니다.

profile
배우고 활용하는 것을 즐기는 개발자, 한지연입니다!

0개의 댓글