- Visitor가 Hair들을 방문할 수 있도록 VisitableHair 인터페이스를 만들자.
- Hair들이 VisitableHair를 구현하도록 하자. (BoldHair, BushyHair, CurlyHair, HairyHair)
- VisitableHair를 방문할 HairShopVisitor 인터페이스를 만들자.
- 실제로 방문해서 일을 할 헤어디자이너들을 구현하자. (Barber, Hairdresser, Stylelist)
public interface VisitableHair {
void accept(HairShopVisitor visitor);
//아직 HairShopvisitor가 없어서 에러가 남
}
public class BoldHair implements VisitableHair {
@Override
public void accept(HairShopVisitor visitor) {
System.out.println(this + " 아무렇게나 해주세요");
visitor.visit(this);
}
@Override
public String toString() {
return "I have a bold Hair";
}
}
public class BushyHair implements VisitableHair {
@Override
public void accept(HairShopVisitor visitor) {
System.out.println(this + " 아무렇게나 해주세요");
visitor.visit(this);
}
@Override
public String toString() {
return "I have a bushy Hair";
}
}
public class CurlyHair implements VisitableHair {
@Override
public void accept(HairShopVisitor visitor) {
System.out.println(this + " 아무렇게나 해주세요");
visitor.visit(this);
}
@Override
public String toString() {
return "I have a curly Hair";
}
}
public class HairyHair implements VisitableHair {
@Override
public void accept(HairShopVisitor visitor) {
System.out.println(this + " 아무렇게나 해주세요");
visitor.visit(this);
}
@Override
public String toString() {
return "I have a Visitable Hair";
}
}
이제 HairShopVisitor를 만들자.
public interface HairShopVisitor {
void visit(BoldHair boldHair);
void visit(BushyHair busyHair);
void visit(CurlyHair curlyHair);
void visit(HairyHair hairyHair);
}
HairShopVisitor를 구현해서 사용하려면 저 위에 있는 모든 객체를 구현 해놔사 사용할 수 있다.일단 하나를 구현해보자.
public class HairShopBarberVisitor implements HairShopVisitor{
@Override
public void visit(BoldHair boldHair) {
System.out.println("나는 이용사입니다. boldHair 군요. 면도해드릴게요\n");
}
@Override
public void visit(BushyHair busyHair) {
System.out.println("나는 이용사입니다. busyHair 군요. 밀어드릴게요\n");
}
@Override
public void visit(CurlyHair curlyHair) {
System.out.println("나는 이용사입니다. curlyHair 군요. 밀어드릴게요\n");
}
@Override
public void visit(HairyHair hairyHair) {
System.out.println("나는 이용사입니다. hairyHair 군요. 밀어드릴게요\n");
}
}
이렇게 하면 방문자로서 하나의 로직이 추가된 것이다. 2개를 마저 만들자.
public class HairShopHairdresserVisitor implements HairShopVisitor{
@Override
public void visit(BoldHair boldHair) {
System.out.println("미용사입니다. boldHair 군요. 파마(?)해드릴게요\n");
}
@Override
public void visit(BushyHair busyHair) {
System.out.println("미용사입니다. busyHair 군요. 파마해드릴게요\n");
}
@Override
public void visit(CurlyHair curlyHair) {
System.out.println("미용사입니다. curlyHair 군요. 파마해드릴게요\n");
}
@Override
public void visit(HairyHair hairyHair) {
System.out.println("미용사입니다. hairyHair 군요. 파마해드릴게요\n");
}
}
public class HairShopHairStylelistVisitor implements HairShopVisitor{
@Override
public void visit(BoldHair boldHair) {
System.out.println("스타일리스트입니다. boldHair 군요. 스타일있게 해드릴게요\n");
}
@Override
public void visit(BushyHair busyHair) {
System.out.println("스타일리스트입니다. busyHair 군요. 스타일있게 해드릴게요\n");
}
@Override
public void visit(CurlyHair curlyHair) {
System.out.println("스타일리스트입니다. curlyHair 군요. 스타일있게 해드릴게요\n");
}
@Override
public void visit(HairyHair hairyHair) {
System.out.println("스타일리스트입니다. hairyHair 군요. 스타일있게 해드릴게요\n");
}
}
이제 테스트를 해보자.
public static void main(String[] args) {
VisitableHair[] variable_hair = { new BoldHair(), new BushyHair(), new CurlyHair(), new HairyHair()};
HairShopVisitor[] artists = {new HairShopBarberVisitor(), new HairShopHairdresserVisitor(), new HairShopHairStylelistVisitor()};
for(HairShopVisitor artist : artists) {
for (VisitableHair hair : variable_hair )
hair.accept(artist);
}
}
답은?
I have a bold Hair 아무렇게나 해주세요
나는 이용사입니다. boldHair 군요. 면도해드릴게요
I have a bushy Hair 아무렇게나 해주세요
나는 이용사입니다. busyHair 군요. 밀어드릴게요
I have a curly Hair 아무렇게나 해주세요
나는 이용사입니다. curlyHair 군요. 밀어드릴게요
I have a Visitable Hair 아무렇게나 해주세요
나는 이용사입니다. hairyHair 군요. 밀어드릴게요
I have a bold Hair 아무렇게나 해주세요
미용사입니다. boldHair 군요. 파마(?)해드릴게요
I have a bushy Hair 아무렇게나 해주세요
미용사입니다. busyHair 군요. 파마해드릴게요
I have a curly Hair 아무렇게나 해주세요
미용사입니다. curlyHair 군요. 파마해드릴게요
I have a Visitable Hair 아무렇게나 해주세요
미용사입니다. hairyHair 군요. 파마해드릴게요
I have a bold Hair 아무렇게나 해주세요
스타일리스트입니다. boldHair 군요. 스타일있게 해드릴게요
I have a bushy Hair 아무렇게나 해주세요
스타일리스트입니다. busyHair 군요. 스타일있게 해드릴게요
I have a curly Hair 아무렇게나 해주세요
스타일리스트입니다. curlyHair 군요. 스타일있게 해드릴게요
I have a Visitable Hair 아무렇게나 해주세요
스타일리스트입니다. hairyHair 군요. 스타일있게 해드릴게요
몇 번 더 만들어보면 손에 익지 않을까 싶다.
댓글 없음:
댓글 쓰기