전략 패턴

2022. 10. 10. 12:16BackEnd(Java)/Design Pattern

✅ 아래 내용들에 대해서 알아보자

- 전략 패턴이란?
- 코드를 보면서 전략 패턴을 이해해보자
- 테스트 코드를 통해 검증하기
- 정리

 

전략 패턴

 전략 패턴은 행위 패턴 중의 하나로써 변하지 않는 부분과 변하는 부분을 구분하여 변하지 않는 부분을 "Context"라는 곳에 두고, 변하는 부분을 "Strategy"라는 인터페이스를 만들고 해당 인터페이스를 구현하도록 해서 문제를 해결하는 방식이다.

 

전략 패턴에서 context는 변하지 않는 템플릿 역할을 하고,  Strategy는 변하는 알고리즘 역할을 한다.

전략 패턴은 상속이 아닌 위임으로 문제를 해결한다.

 

 GOF 디자인 패턴에서 정의한 전략 패턴은 의도는 다음과 같다

알고리즘 제품군을 정의하고 각각을 캡슐화하여 상호 교환 가능하게 만들자.
전략을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다.

 

 

전략 패턴을 실제로 적용해볼까요?

 개발자는 글보다는 실제 코드를 쳐보면서 이해하는 게 제일 빠릅니다 ㅎㅎ 😛😛

그러면 우리 같이 전략 패턴을 적용해보면서 이해해 봅시다.

 

우리가 게임 프로그램을 만든다고 생각해봅시다. 프로그램의 요구사항은 다음과 같습니다.

 

  1. 게임 캐릭터를 생성할 수 있어야 한다. 캐릭터의 종류는 현재 4가지(King, Queen,  Knight, Troll)이지만 추 후 더 늘어날 수도 있습니다.
  2. 캐릭터는 한 번에 한 가지 무기만 사용할 수 있지만, 게임 도중에 무기를 변경할 수 있습니다.
  3. 캐릭터가 싸울 때는 싸우는 방식은 각각 다릅니다.(ex. 킹은 한 손으로 싸운다, 나이트는 양손으로 싸운다 등...)

 

캐릭터 설계

 캐릭터라는 추상화 클래스를 만들어 상속을 통하여 각각의 캐릭터들의 속성을 공통화하여 설계하였다.

 

아래 코드를 보면 변화지 않는 부분과 변화는 부분을 나누었는데 위의 전략 패턴에서 설명한 것처럼 Context와 Strategy로 나누어서 구분하였다. WeaponStrategy를 인터페이스 설계하여 캐릭터가 무기를 변경할 수 있게 설계하였다.

 

 

 

각 캐릭터 클래스들이 Charactr 클래스를 생성받아 무기 전략을 파라미터로 받는 각 생성자를 정의한다.

 

 

무기 설계

 아래의 실체 구현체인 클래스들이 WeaponStrategy를 implements 하여 useWeapon을 무기별 용도에 맞게 재정의 한다.

 

 

테스트 코드를 통해 검증해보자

 King 인스턴스를 하나 만들어서 예시를 설명하겠습니다. (King 뿐만 아니라 Queen, Troll 등 다른 캐릭터도 생성 가능)

상위 클래스인 Character를 사용하여 구현체가 아닌 추상화에 맞춰 인스턴스 생성 후 무기는 검을 사용하게 전략을 설정 후 각 클래스마다 재정의한 fight() 메서드를 호출하였습니다. 

 

그리고 무기를 검 -> 도끼로 바꿔 fight 메서드를 호출하였습니다. 이로 인해 바뀌는 부분인 Strategy만 변화를 통해 기존 코드 변경 없이 캐릭터가 자유자재로 무기를 변경할 수 있게 만들었습니다! 😁😁

 

도끼-> 활 -> 칼로 유동적으로 무기를 변경할 수 있겠죠? 이러한 변하는 부분을 전략적으로 사용하는 패턴을 전략 패턴이라고 합니다. 조금 이해가 되셨나요? ㅎㅎ

 

 

 

정리

 다시 한번 GOF 디자인 패턴에서 정의한 전략 패턴 의도를 볼까요??

알고리즘 제품군(=>변화하는 부분)을 정의하고 각각을 캡슐화하여 상호 교환 가능하게 만들자.
전략을 사용하면 알고리즘을 사용하는 클라이언트(=>바뀌지 않는 부분)와 독립적으로 알고리즘을 변경할 수 있다.

 

결국 바뀌지 않는 부분과 바뀌는 부분을 분리하여 바뀌는 부분을 유동적으로 변화할 수 있게 설계하는 것입니다.

이상 전략패턴 설명이였습니다.

 

감사합니다 😜😜

 


참고 자료

  • 김영한 스프링 핵심 원리 - 고급편
  • 헤드 퍼스트 디자인 패턴
반응형

'BackEnd(Java) > Design Pattern' 카테고리의 다른 글

커맨드 패턴  (1) 2024.10.07
데코레이터 패턴  (0) 2024.09.24
옵저버 패턴  (0) 2024.09.23
디자인 패턴을 왜 써야할까?  (0) 2022.10.10
Builder 패턴  (0) 2022.03.30