본문 바로가기

디자인패턴

[디자인패턴] Strategy Pattern

반응형
[디자인패턴]Strategy Pattern

[디자인패턴] Strategy Pattern

Strategy Pattern은 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있또록 만든다. Strategy Pattern을 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다. 개를 표현하는 클래스를 만들고자 한다. 개는 여러 종류가 있기 때문에 슈퍼 클래스 Dog를 상속받아 여러 종류의 개를 표현할 계획이다. UML을 그리면 다음과 같다.

Imgur 이렇게 하면 Dog을 상속받아 다양한 개를 표현할 수 있을 것이다. 하지만 개발을 진행하다가 장단감 강아지가 필요해 추가하게 되었다. 장난감 강아지는 소리는 낼 수 있지만 움직이는 기능이 없다. 슈퍼 클래스 Dog의 Bark와 Run과 다른 행동을 취해야 하기 때문에 오버라이드를 통해 새로 정의를 해주었다.

Imgur 진도개와 푸들은 "멍멍"하고 짖지만 삽살개는 "왈왈"하고 짖는다. 오버라이드를 통해 구현할 경우 공통된 부분이 있음에도 똑같은 구현이 중복된다. 만일 날 수 있는 개가 추가된다면 어떨까? Dog의 Fly 메소드가 추가되고 상속받은 모든 클래스를 일일이 수정해야 할 것이다. 다양한 기능을 가진 개가 추가될 수록 코드 수정이 어려워지고 복잡해진다. 이를 해결할 방법이 Strategy Pattern이다. 변하는 부분과 그대로 있는 부분을 분리하여 표현해보자. Dog의 행동들을 클래스로 분리해 주어야 한다. Dog의 동작인 Bark와 Run을 분리시켜 각 행동을 나타낼 클래스 집합을 새로 만든다. 이 행동들을 인터페이스로 구현하여 특정 행동만을 목적으로 하는 클래스의 집합을 만들어 보자. BarkBehavior 인터페이스를 정의하고 이를 상속받아 "크게 짖기"와 "조용히 짖기"를 구현하려 한다. 구성은 다음과 같다.

Imgur Dog에서 BarkBehavior를 사용하게 하면 된다.

Dog 클래스의 BarkActivity를 통해 상속받은 클래스에서 개의 행동을 지정할 수 있다.

코드를 짜다가 헤더 중복 include해서 오류가 났었다. #ifndef를 통해 해결하였다. 테스트 결과 크게 잘 짖는 것을 확인했다. 이처럼 행동을 정의하고 각각을 캡슐화 하여 사용할 수 있는 패턴인 Strategy Pattern을 살펴보았다.


반응형

'디자인패턴' 카테고리의 다른 글

[디자인패턴] Observer Pattern  (0) 2018.10.27