본문 바로가기

프로그래밍 강의 메모/코딩으로 학습하는 GoF의 디자인 패턴_백기선

행동 관련 디자인 패턴 > 비지터 패턴(Visitor Pattern)

https://inf.run/6Shr

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

 

 

비지터 패턴

  • 행동 관련 디자인 패턴.
  • 기존 코드를 변경하지 않고 새로운 기능을 추가하는 방법.
  • ※ Double Dispatch를 활용할 수 있다.

※ Double Dispatch

Dynamic Dispatch가 2번 발생하는 것으로,

Dynamic Dispatch는 런타임 시에 호출해야하는 인스턴스를 확인하여 해당 인스턴스의 메서드를 호출하는 과정.

어떤 인스턴스의 메서드가 호출될 지는 런타임이 되어야 알 수 있다.

 

 

 

 

 

보통은 새로운 기능을 추가할 때 기존 클래스에다 코드를 추가하는 방법을 사용한다.

 

single-responsibility principle(SRP) 을 지키고 싶어 기존 클래스에 추가하지 않고 싶거나, 추가할 수 없는 경우도 있다.

 

코드를 분리하고 싶거나

코드 특성상 다른 곳에서 적용될 것 같아 한 곳에 모아 놓고 싶을 때

이런 경우 비지터 패턴을 사용하면 좋다.

 

 

 

디스패치란 다형성으로 구현된 구조에서 요청이 들어오면 그 요청을 처리할 구체적인 클래스에서 메서드를 찾아서 분배, 배치하여 위임하는 과정을 의미한다.

 

이렇게 인터페이스에서 구체적인 타입을 찾아가는 과정이 2번 일어나는 패턴이다.

 

이런 구조로 작성하면 이프 엘스문을 없엘 수 있다.

 

 

public void accept(Visitor)

{

    Visitor.visit(this);

}


이 패턴을 적용하려면 기존 코드에서 Visitor를 파라미터로 하는 억셉트만 추가해주면 된다.

 

Visitor 안에서 Visitor.visit(this)로 자기 자신 Element를 파라미터로 넘겨준다.

 

Visitor에서는 visit 메서드에 오버로딩이 적용되어 있어서 파라미터가 다르면 다른 로직을 실행한다.

 

같은 이름의 visit로 각각의 Element마다 파라미터를 받는 메서드를 요소의 개수만큼 오버로딩 해줘야 한다.

 

 

 

 

 

 

 

 

이 패턴에서 더블 디스패치를 사용한다고 말하는 이유.

1. Rectangle에 있는 accept를 호출해야 하는데, Shape를 상속받는 클래스 중 어느 클래스에 있는 accept인지 찾아가는 것이 첫 번째 디스패치이다.

2. accept를 실행하면 Device의 print를 호출하는데 Device를 상속받은 클래스 중 어느 클래스에 있는 print를 호출하는지 찾아가는 것이 두 번째 디스패치이다.

 

 

비지터 패턴의 장점

1. 기존 코드를 변경하지 않고 새로운 코드를 추가할 수 있다.

2. 추가 기능을 한 곳에서 모아둘 수 있다.

 

비지터 패턴의 단점

1. 복잡하다.

2. 새로운 엘리먼트를 추가하거나 제거할 때 모든 비지터 코드를 변경해야 한다.

 

 

 

 

 

 

https://refactoring.guru/ko/design-patterns/visitor

 

Visitor

Problem Imagine that your team develops an app which works with geographic information structured as one colossal graph. Each node of the graph may represent a complex entity such as a city, but also more granular things like industries, sightseeing areas,

refactoring.guru