Search

디자인 패턴 - 전략, 방문자, 템플릿 메서드

리팩터링을 읽으며 책 또는 스터디 중 논의하며 나온 디자인 패턴에 대해 정리한다. 관련이 있는 클린 아키텍처나 아니면 참조하는 너구리 “책”을 읽은건 아니고 웹에 공개된 것을 참고하여 간단하게 알아본다.

전략 패턴

여기서 말하는 전략은 알고리즘 객체로 나타낸 것이고 패밀리라고 표현한 추상 클래스와 실제 알고리즘을 구현한 구체 클래스들이 있다.
그리고 그 전략들, 엄밀히 말하면 전략들이 공유하는 인터페이스의 객체를 가진 컨텍스트 객체를 클라이언트가 사용하게 된다.
전략 패턴은 실행(execute)에 구체적인 방식 차이는 있지만 의도가 같은 알고리즘들에게 인터페이스를 제공/제한한다.
원글의 예시처럼 버스, 자전거, 자동차, 비행기 등 각기 방식은 다르지만 경로 찾기(buildRoute)라는 실행 의도는 같다.
나도 마침 비슷한 필요를 느끼고 있다. 간단한 웹 퍼즐(링크달기)을 만들고 있는데 조작 방식으로 드래그앤드롭과 클릭을 지원하는 것이다(원랜 드래그앤드롭만 만들었다). 하지만 전략 패턴의 단점으로 다음을 꼽았기 때문에 일단 계획한대로 플래그로 두 가지 중 하나를 토글하는 방식으로 만들 것이다
알고리즘이 몇 개밖에 되지 않고 거의 변하지 않는다면, 패턴과 함께 사용되는 새로운 클래스들과 인터페이스들로 프로그램을 지나치게 복잡하게 만들 이유가 없습니다.
어떤 프레임워크를 사용하다보면 컨텍스트, ctx 같은건 많이 사용하는데 그것들이 다 전략 패턴이려나? 아님 디자인 패턴에서 개념적으로 많이 지칭하는 명사인가. 아직 모르겠다.
리팩터링에선 기능 편애, 즉 자주 호출하는 외부 모듈끼리 묶는 것의 반대로 이 패턴을 말했는데, 위 다이어그램만 봐도 알 수 있다. 전략 패턴을 사용하면 실제 전략을 실행하기 위한 간접 호출은 두 단계 늘어난다:
context.doSomething()strategy.execute()concreteStrategy.execute()

방문자 패턴

비지터 패턴은 특정 행동을 알고리즘 작동 객체에서 분리한다고 한다. 글 예제에 따르면 내보내기(export)가 행동이고 도형의 각기 모양이 알고리즘이다.
비지터 패턴으로 달성할 수 있는 것 중 하나는 기존 코드 작동을 변경하지 않는다, 동작하는 객체의 코드로부터 “분리”한다, 라고 이야기한다. 하지만 비지터로 추가하는 행동을 수락(accept)하는 인터페이스는 추가 된다. 따라서 기존 코드(객체의 클래스)를 아예 바꾸지 않는 것은 아니지만, 원래 클래스의 알고리즘과 무관하다는 것을 “표시”해준다.
아주 와 닿지는 않지만… 어쨌든 이번에도 기능 편애와 반대되는 측면에서 보면, 요소(element) 클래스 안에 새로 추가하면 될 행동을 비지터를 통해 호출하기 때문에 간접 호출은 늘어난다. 이 역시 요소(알고리즘) 수 등을 고려해 적절하게 적용해야겠다. 디자인 패턴이 성의 없는 요소가 되지 않도록.

이중 디스패치

한번에 이해가 안된다  다시 읽자

템플릿 메서드 패턴

템플릿 메서드 패턴은 리팩터링 3장에서 언급되진 않지만, 지난 장을 스터디하며 팀 내에서 이야기 했어서 찾아봤다. 꽤 익숙한 패턴이다. 자식 클래스의 메서드 “골격”을 정의한다는 것은 클래스로써 당연한 일을 하는거 같다.
부모 클래스에서 골격 메서드를 추상으로 정의하여 자식에서 구현을 강제하거나, 자식에서 중복되는 동작을 끌어 올릴 수 있다. 그러면서 자식에서 필요한 동작은 완전히 재정의, 오버라이드 할 수도 있다.
사실 위의 두 패턴은 기능 편애의 반대로써 그리고 내가 해석하기엔 성의 없는 요소의 예시처럼도 느껴졌지만, 템플릿 메서드 패턴은 지금까지 읽은 리팩터링과는 아주 잘 어울리는 패턴으로 보인다. 중복을 제거하기 때문에. 그것을 클래스 수준에서 상속을 통해서 하는 것이다.

행동 패턴?

공교롭게도 리팩터링 책에서 또는 읽으면서 언급한 패턴들은 모두 행동 패턴이었다. 또 직접 패턴이라는 언급은 없었지만 등장한 중개자도 여기에 있다.
리팩터링 책에서 카탈로그만 즉, 기법만 나열했다면 덜 와 닿았을거 같다. 그럼에도 디자인 패턴과 맞닿는 부분이 있어 위 웹사이트는 비교적 나열이지만 상황을 이해하며 읽을 수 있었다. 단순 암기가 아니라. 그래서 클린 아키텍처나 패턴을 활용한 리팩터링도 읽어 보고 싶다.