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. 작업해야 하는 요소들의 비공개 필드 및 메서드들에 접근하기 위한권한이 부족할 수 있음출처
이 글은 인프런 박은종 강사님의 강의 내용을 정리하기 위하여 작성하였습니다.