본문 바로가기
Programming/DesignPattern

[디자인 패턴] 전략(Strategy) 패턴

by Blemish 2021. 4. 26.

전략 패턴(Strategy Pattern) 

  • 행위를 클래스로 캡슐화하여 동적으로 행위를 자유롭게 해주는 패턴
  • 객체의 행위를 동적으로 변경하고 싶은 경우 직접 행위를 수행하지 않고 전략을 바꾸어주기만 함으로써 행위를 유연하게 확정하는 방법

 

예시(Example)

*Class Diagram

 

  • 부모클래스 (Duck) 과 자식클래스 (MallardDuck, RedheadDuck)

 

*Example Code

 

  • Question
    • 만약 RedheadDuck이 울음소리를 내지 못한다면? -> RedheadDuck의 Quack()을 수정해야함
    • 만약 MallardDuck이 날지 못한다면? -> MallardDuck의 fly()를 수정해야함

문제점

  • 기존코드를 수정해야하 하므로 OCP에 위배됨.
  • 클래스가 확장될 경우 중복 메소드가 생길 가능성이 높음

해결방법

  • 코드에서 달라지는 부분과 달라지지않는 부분을 분리한다. (Fly, Quack)
  • 코드상에서 변화가 될 수 있는 부분은 Quack, Fly이다. 따라서 변화될 수 있는 부분을 인터페이스로 구현한다.(QuackBehavior, FlyBehavior)
  • Fly -> 날수있는(FlyWithWings) 과 날수없는(FlyNoway)에 대해서 구현한다.
  • Quack -> 소리를 낼수 있는(Quack) 과 소리를 낼수없는(MuteQuack)에 대해서 구현한다.

  •  Duck 클래스에서 각 인터페이스를 정의(QuackBehavior, FlyBehavior)
  •  변경된 구조에 맞게 외부에서 접근하여 변경할 수 있도록 Get(GetQuackBehavior, GetFlyBehavior), Set(SetQuackBehavior, SetFlyBehavior) 함수를 구현

Client

댓글