CS | 전략 패턴

happy tiger·2022년 10월 14일
0

CS

목록 보기
5/10
post-thumbnail

전략 패턴이란?

전략 패턴(strategy pattern)은 정책 패턴(policy pattern)이라고도 하며, 객체의 행위를 바꾸고 싶은 경우 '직접' 수정하지 않고 전략이라고 부르는 '캡슐화한 알고리즘'을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴이다.

class Animal:
    def speak(self):
        pass

class Cat(Animal):
    def speak(self):
        print("meow")

class Lion(Animal):
    def speak(self):
        print("roar")

def makeSpeak(animal:Animal):
    animal.speak()

def createAnimal(input_str:str):
    if input_str == "cat":
        return Cat()
    elif input_str == "lion":
        return Lion()

input_str = input("choose animal(cat or lion): ")

animal = createAnimal(input_str)
makeSpeak(animal)

위의 코드를 보자. makeSpeak()함수 안에서는 특별한 if문이 없지만, 특별한 코드 수정 없이 catlion이 상호 교체가 가능한 전략 패턴이다.

다른 예로, Node.js에서 사용하는 미들웨어 라이브러리인 passport에서는, 여러 가지 '전략'을 기반으로 인증할 수 있게 한다. 서비스 내의 회원가입된 아이디와 비밀번호를 기반으로 인증하는 LocalStrategy 전략과 페이스북, 네이버 등 다른 서비스를 기반으로 인증하는 OAuth 전략 등을 지원한다. 로그인 방식의 '전략'만 바꿔서 두 가지 방식으로 로그인하는 것을 구현한 것이다.

전략 패턴의 장단점

장점

  • 코드 변경 없이 새로운 전략을 추가 할 수 있다.

    • 이를 통해 if - else 분기를 제거할 수 있다.
    • if - else 분기를 제거하면, 단일 책임 원칙을 준수하기 더 수월해진다.
      ( 단일 책임 원칙: 하나의 클래스(객체)는 하나의 책임만 가지며, 그 책임을 완전히 캡슐화해야 함을 일컫는다. )
  • 확장에 유리한 코드를 작성할 수 있다.

    • 새롭게 필요한 전략 콘크리트 클래스를 쉽게 만들 수 있다.
    • 개방 폐쇄 원칙을 준수한 코드 작성이 가능하다.
      ( 개방 폐쇄 원칙: 프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다. )
  • 런타임에 전략을 변경시킬 수 있다.

단점

  • 어플리케이션에 들어가는 모든 전략을 알고 있어야 한다.

    • 클래스로 분리한 각 전략들이 어느 상황에 사용되어야 할 지 알고 있어야 한다.
    • 이 같은 특성이 어쩌면 유지보수를 더 힘들게 할 수도 있다.
  • 전략을 추상화한 인터페이스가 효율적이지 못할 수 있다.

    • 어떤 전략 콘크리트 객체에서는 사용하지 않는 메서드들 역시 전략 인터페이스에 정의해 주어야 한다.
profile
호기심·끈기·성장·발전·행복·협력 ٩(๑•̀ㅂ•́)و

0개의 댓글