본문 바로가기

Design/Design Pattern

[Design Pattern] Strategy Pattern

이번 장에서는 전략(Strategy) 패턴에 대해서 알아보도록 한다.
샘플 코드는 여기 (링크) 프로젝트의 테스트 코드로 정리해두었다.


필자는 모든 디자인 패턴을 우리 일상 생활에 접목시켜서 알아보려한다.
이번 전략 패턴은 유명한 햄버거 브랜드 "버거킹"에 접목시켜 알아보겠다.

전략 패턴이란?

비슷한 기능을 하는 클래스(전략)들을 캡슐화하여 이를 선택적으로 사용하는 패턴이다.
사용하는 쪽에서 선택적으로 전략을 선택하기 때문에 이를 수행하는 클라이언트 쪽의 코드는 수정이 필요없다.

GoF Design Patterns에 따르면 아래와 같은 Class Diagram이 그려진다.

전략 Interface를 생성하고 이를 구현하는
ConcreteStrategyA, ConcreteStrategyB, ConcreteStrategyC를 만들었다.
이를 사용하는 Context는 자신이 원하는 전략을 선택하여 사용한다.
설명이 너무 추상적이라면 바로 아래의 "버거킹"을 보자.

Class Diagram을 "버거킹"에 접목시켜보면 아래와 같은 Class Diagram이 그려진다.

BurgerKing의 메뉴라면 가져야하는 속성을 정의하는 BurgerKingMenu (Strategy)를 생성하고
이를 충족하는 Wafer, CheeseWafer, DoubleWafer 버거 (Concrete Strategy)를 구현하였다.
버거킹의 고객인 BurgerKingCustomer는 주문할 때 OrderForm(주문서)에 자신이 원하는 버거를 선택하여 주문한다.

다시 한번 정리해보면 실제 주문하면 이루어지는 알고리즘은 각각 버거들에 캡슐화되어있다.
그렇기 때문에 고객이 어떠한 버거를 주문하더라도 OrderForm의 코드는 변경이 필요없다.
바로 코드로 살펴본다.

BurgerKingMenu Interface order라는 메소드를 정의하고 있다.

BurgerKingMenu Interface

BurgerKingMenu의 구현체인 CheeseWafer, DoubleWafer, Wafer는 order가 호출되었을 때를 구현하고 있다.

Wafer Class

DoubleWafer Class

CheeseWafer Class

주문서인 OrderForm 클래스는 멤버 변수로 BurgurKingMenu를 가지며 Wafer, DoubleWafer, CheeseWafer 어떠한 버거든 올 수 있다.

OrderForm Class

실제 주문을 진행하는 BurgerKingCustomer는 주문서인 OrderForm을 생성하고 원하는 메뉴를 선택하여 주문을 진행한다.
모두 order를 호출하지만 주문서에 적힌 버거(전략)에 맞는 주문 로직을 진행된다.

BurgerKingCustomer Class

테스트 코드를 실행하면 결과는 아래와 같다.


지금까지 전략 패턴과 전략 패턴과 버거킹 주문 시스템을 비교하여 알아보았다.