(디자인패턴 - 전략패턴

Link copied to clipboard

전략 패턴

Link copied to clipboard
  • 전략 패턴(strategy pattern) 또는 정책 패턴(policy pattern)
  • 전략 패턴은 실행 중에 알고리즘을 선택할 수 있게 하는 디자인 패턴으로 다음의 특징을 가짐
    • 특정한 알고리즘을 정의하고
    • 각 알고리즘을 캡슐화
    • 해당 계열 안에서 상호 교체가 가능하도록 함
  • 위와 같은 특징을 구현하기 위해 다음 세가지 요소로 구성
    • 전략 메서드를 가진 전략 객체
    • 전략 객체를 사용하는 컨텍스트
    • 전략 객체를 생성해 컨텍스트를 주입하는 클라이언트
  • 전략은 알고리즘을 사용하는 클라이언트와 독립적으로 다양하게 만들 수 있음

코드

Link copied to clipboard
import abc

class Duck:
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def display(self):
        pass

    def perform_fly(self):
        self.fly_behavior.fly()

    def perfrom_quack(self):
        self.quack_behavior.quack()
  • Duck 클래스를 생성, 상세 행동은 구현하지 않음
class FlyBehavior:
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def fly(self):
        pass

class FlyWithWings(FlyBehavior):
    def fly(self):
        print("Fly with wings")

class FlyNoWay(FlyBehavior):
    def fly(self):
        print("Fly no way")

class QuackBehavior:
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def quack(self):
        pass

class Quack(QuackBehavior):
    def quack(self):
        print("Quack Quack")

class MuteQuack(QuackBehavior):
    def quack(self):
        print("Mute...")
  • 상세 행위는 다음과 같이 정의
class MallardDuck(Duck):
    def __init__(self):
        self.fly_behavior = FlyNoWay()
        self.quack_behavior = Quack()

    def display(self):
        print("Mallard Duck")
  • 새로운 오리를 생성할 때, Duck을 상속받고, 추가적인 행동을 정의하여 사용할 수 있음

참조

Link copied to clipboard