왜 방문을 해서 로직을 추가하는 걸까? 그냥 해당 클래스에 로직을 넣어서 쓰면 안될까?
해당 클래스를 바꾸지 못할 때 쓰는 것일까? 해당 클래스들의 자료구조는 변화하지 않을 것이고 로직은 계속 추가될 것이라면 비지터가 좋을 것 같기도 하다.
여기 머리를 자르기로 하자.
곱슬, 직모, 탈모, 대머리, 금발의 긴머리, 뽀글뽀글 등등 여러가지의 머리가 있다. 이들은 모두 미용실에가서 이렇게 말한다.
어울리게 잘라주세요이제 미용사 성향 / 머릿카락에 따라 머리를 자를 것이다. 구현은
- Hair, HairShop 인터페이스 생성
- 각 인터페이스의 구현체 생성(BoldHair, BushyHair / Barber, Hairdresser)
- 그리고 테스트
// 1. 인터페이스 생성
public interface Hair { }
public interface HairShop {
void cut(BoldHair boldHair);
void cut(BushyHair busyHair);
void cut(Hair hair);
}
이제 인터페이스를 구현하자.
// 2. 구현체 생성
public class BoldHair implements Hair{ }
public class BushyHair implements Hair{ }
public class Barber implements HairShop {
@Override
public void cut(BoldHair boldHair) {
System.out.println("Barber : boldHair");
}
@Override
public void cut(BushyHair busyHair) {
System.out.println("Barber : BusyHair");
}
@Override
public void cut(Hair hair) {
System.out.println("Barber : Hair Interface... ");
}
}
public class Hairdresser implements HairShop{
@Override
public void cut(BoldHair boldHair) {
System.out.println("Hairdressor : BoldHair");
}
@Override
public void cut(BushyHair busyHair) {
System.out.println("Hairdressor : BushyHair");
}
@Override
public void cut(Hair hair) {
System.out.println("Hairdressor : Hair Interface... ");
}
}
이제 테스트를 해보자.
public class Test {
public static void main(String[] args) {
Hair[] hairs = {new BoldHair(), new BushyHair()};
HairShop[] artists = {new Barber(), new Hairdresser()};
for (Hair hair : hairs)
for (HairShop artist : artists)
artist.cut(hair);
}
}
콘솔을 확인
Barber : Hair Interface...
Hairdressor : Hair Interface...
Barber : Hair Interface...
Hairdressor : Hair Interface...
이렇게 된다. 결국 머릿카락의 정보는 가질 수 없다. 왜냐하면 자바는 싱글디스패치이기 때문인데 자세한 내용은 더블디스패치관련 글을 읽어보기를 바라면서...여하튼 비지터패턴은 해당 클래스를 변경하지 않고 Visitor들을 추가해서 일을 할 수 있게 한다.
Visitor만 새로 만들면 hair들은 새로운 로직을 추가하지 않고 로직을 추가할 수 있게 된다.
출처:
https://dzone.com/articles/design-patterns-visitor https://sourcemaking.com/design_patterns/visitor/java/1 https://www.tutorialspoint.com/design_pattern/visitor_pattern.htm
댓글 없음:
댓글 쓰기