Posts [개발자 블로그] 스트래티지 패턴(Strategy Pattern)
Post
Cancel

[개발자 블로그] 스트래티지 패턴(Strategy Pattern)

스트래티지 패턴(Strategy Pattern)

  • 전략을 쉽게 바꿀 수 있도록 해주는 디자인 패턴이다. 여기에서 전략이란 어떤 목적을 달성하기 위해 일을 수행하는 방식, 비즈니스 규칙, 문제를 해결하는 알고리즘 등으로 이해할 수 있다. 프로그램에서 전략을 실행할 때는 쉽게 전략을 바꿔야 할 필요가 있는 경우가 많이 발생한다. 특히 게임 프로그래밍에서 게임 캐릭터가 자신이 처한 상황에 따라 공격이나 행동하는 방식을 바꾸고 싶을 때 스트래티지 패턴은 매우 유용하다.

로봇 만들기 Example

image

문제점

  • 1) 기존 로봇의 공격 또는 이동 방법을 수정하려면 어떤 변경 작업을 해야 하는가? 예를 들어 아톰이 날 수는 없고 오직 걷게만 만들고 싶다면? 또는 태권V를 날게 하려면?
    • => 새로운 기능으로 변경하고 기존 코드의 내용을 수정해야 하므로 OCP에 위반
  • 2) 새로운 로봇을 만들어 기존의 공격 또는 이동 방법을 추가하거나 수정하려면? 예를 들어 새로운 로봇으로 지구의 용사 선가드(Sungard 클래스)를 만들어 태권V의 미사일 공격 기능을 추가하려면?
    • => 코드 중복 발생 (Bad Smell) -> 리팩토링
      image

해결책

  • 무엇이 변화되었는지를 찾은 후에 이를 클래스로 캡슐화 한다.
    image
    image

예제1. 다음 설계의 문제를 지적하고 스트레티지 패턴을 사용하여 작성하라

image

  • 임금을 계산하는 로직이 변경되면 내부코드를 수정해야 한다.
    스크린샷 2021-03-03 오후 4 43 04

스트래티지 패턴의 일반적인 형태

image

  • Strategy: 인터페이스나 추상 클래스로 외부에서 동일한 방식으로 알고리즘을 호출하는 방법을 명시
  • ConcreteStrategy1, ConcreteStrategy2, ConcreteStrategy3: 스트래티지 패턴에서 명시한 알고리즘을 실제로 구현한 클래스
  • Context: 스트래티지 패턴을 이용하는 역할을 수행한다. 필요에 따라 동적으로 구체적인 전략을 바꿀수 있도록 setter메서드를 제공한다.

스트래티지 패턴의 순차다이어그램

image

스트래티지 패턴을 로봇 예제에 적용한 경우

image

출처

  • Java객체지향 디자인패턴(한빛미디어)
This post is licensed under CC BY 4.0 by the author.

[개발자 블로그] 옵서버 패턴(Observer Pattern)

[Backend] Restful API의 개요