728x90
반응형
Visitor Pattern
기존 코드를 변경하지 않고 새로운 기능을 추가하는 방법
더블 디스패치(Double dispatch)를 활용할 수 있다.
BEFORE
- 예시를 위해 지저분하지만 아래와 같이 코드를 써본다.
Client
public class Client {
public static void main(String[] args) {
Shape rectangle = new Rectangle();
Device device = new Phone();
rectangle.printTo(device);
}
}
Shape - Rectangle, Triangle
public interface Shape {
void printTo(Device device);
}
public class Rectangle implements Shape {
@Override
public void printTo(Device device) {
if (device instanceof Phone) {
System.out.println("print Rectangle to phone");
} else if (device instanceof Watch) {
System.out.println("print Rectangle to watch");
}
}
}
public class Triangle implements Shape {
@Override
public void printTo(Device device) {
if (device instanceof Phone) {
System.out.println("print Triangle to Phone");
} else if (device instanceof Watch) {
System.out.println("print Triangle to Watch");
}
}
}
Device - Phone, Watch
public interface Device {
}
public class Phone implements Device{
}
public class Watch implements Device{
}
AFTER
Client
public class Client {
public static void main(String[] args) {
Shape rectangle = new Rectangle();
Device device = new Pad();
rectangle.accept(device);
}
}
Shape - Rectangle, Triangle, Circle
public interface Shape {
void accept(Device device);
}
public class Rectangle implements Shape {
@Override
public void accept(Device device) {
device.print(this);
}
}
public class Triangle implements Shape {
@Override
public void accept(Device device) {
device.print(this);
}
}
public class Circle implements Shape {
@Override
public void accept(Device device) {
device.print(this);
}
}
Device - Phone, Watch, Pad
public interface Device {
void print(Circle circle);
void print(Rectangle rectangle);
void print(Triangle triangle);
}
public class Phone implements Device {
@Override
public void print(Circle circle) {
System.out.println("Print Circle to Phone");
}
@Override
public void print(Rectangle rectangle) {
System.out.println("Print Rectangle to Phone");
}
@Override
public void print(Triangle triangle) {
System.out.println("Print Triangle to Phone");
}
}
public class Watch implements Device {
@Override
public void print(Circle circle) {
System.out.println("Print Circle to Watch");
}
@Override
public void print(Rectangle rectangle) {
System.out.println("Print Rectangle to Watch");
}
@Override
public void print(Triangle triangle) {
System.out.println("Print Triangle to Watch");
}
}
public class Pad implements Device {
@Override
public void print(Circle circle) {
System.out.println("Print Circle to Pad");
}
@Override
public void print(Rectangle rectangle) {
System.out.println("Print Rectangle to Pad");
}
@Override
public void print(Triangle triangle) {
System.out.println("Print Triangle to Pad");
}
}
[패턴 복습]
장점 | 단점 |
- 기존 코드를 변경하지 않고 새로운 코드를 추가할 수 있다. - 추가 기능을 한 곳에 모아둘 수 있다. |
- 복잡하다. - 새로운 Element를 추가하거나 제거할 때 모든 Visitor 코드를 변경해야 한다. |
[실무에서 쓰이는 경우]
- 자바
- FileVisitor, SimpleFileVisitor
- AnnotationValueVisitor
- ElementVisitor
- 스프링
- BeanDefinitionVisitor
728x90
반응형
'Design Patterns > 행동(Behavioral)' 카테고리의 다른 글
[Template method]템플릿메소드패턴 (0) | 2022.11.22 |
---|---|
[Strategy]전략패턴 (2) | 2022.11.22 |
[State]상태 패턴 (0) | 2022.11.22 |
[Observer]옵저버패턴 (0) | 2022.11.08 |
[Memento]메멘토패턴 (0) | 2022.11.03 |