본문 바로가기
Design Pattern

20. 전략 패턴 (strategy pattern)

by 킹차니 2021. 12. 31.

전략 패턴

여러 알고리즘들을 캡슐화하고 상호 교환 가능하게 만드는 패턴

--> 컨텍스트에서 사용할 알고리즘들을 클라이언트에서 선택한다.

즉 특정 업무을 수행하는 방법이 여러가지 일 때, 여러가지 방법들을 각각의 클래스로 캡슐화하면, 캡술화된 것을 공통된 인터페이스로 추상화하여 업무를 수행하는 Client에서는 요 인터페이스를 사용하게 하여 Client의 코드는 변경되지 않아도, 여러 방법들을 바꿔 낄 수 있도록 한다. 

(예 : 자바의 Comparator)

 

Context : 원래의 로직을 수행하던 클래스

ConcreteStrategy : 각각의 알고리즘들이 구현된 클래스

Strategy : 추상화된 알고리즘 수행 인터페이스

 


코드로 알아보기

'무궁화꽃이 피었습니다'를 하는 코드가 있다고 하자. "무궁화 꽃이~"까지는 파란 불. "피었습니다!"까지는 빨간 불이다.

해당 클래스는 speed를 가지는데, speed마다 "무궁화꽃이" 혹은 "피었습니다"를 말하는 속도가 다르다. (speed가 높을 수록 빠름)

 

❗️문제점 ❗️

현재 각 speed에 따라 분기마다 다르게 행동해야 한다. 특히 다르게 행동하기 위해 클라이언트에서 speed를 1, 2 또는 3라는 구체적인 숫자를 바꿔줘야 한다. 또한 새로운 speed 가 4일때의 로직을 추가하려 한다면 기존의 코드를 수정해야 한다.

이를 전략 패턴을 적용하여 해결해보자.

 

 

 

먼저 Strategy인터페이스를 정의한다.

 

각각의 ConcreteStrategy인 Slower(speed가 1), Normal(speed가 2), Faster(speed가 3)은 이를 구현하면 된다.

 

그리고 Context인 BlueLightRedLight는 아래와 같다.

생성자에서 Speed타입 클래스 (Slower, Normal, Faster)중 하나를 받아 그에 따른 로직을 처리하는 것이다.

 

이를 사용하는 클라이언트는 아래와 같다.

Slower적용

실행결과:

 

그런데 만약 BlueLight와 RedLight의 속도를 다르게 하고 싶다면?? 아래와 같이 생성자가 아닌 메소드에서 Speed타입 클래스를 인자로 받으면 된다.

 

이를 이용한 클라이언트는 다음과 같다.

blue는 Slower, red는 Faster

실행결과:

 


장점과 단점

 

장점

1. 새로운 전략을 추가하더라도 기존 코드를 변경하지 않는다. OCP

2. 상속 대신 위임을 사용할 수 있다.

3. 런타임에 전략을 변경할 수 있다.

 

단점

1. 복잡도가 증가한다.

2. 클라이언트 코드가 구체적인 전략을 알아야 한다.

 

 


실제로 어디에 사용되나?

 

1. 자바의 Comparator

 

2. Spring의 ApplicationContext등등...

 

 

출처: 인프런 백기선님 '코딩으로 학습하는 GoF 강의'
https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4