Skip to content

Strategy Pattern

Glory Day edited this page May 17, 2022 · 19 revisions

About

객체들이 할 수 있는 행위(Method) 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화하는 인터페이스를 정의하여, 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법이다.

UML Class

UML_Class_1

전략 패턴 UML 클래스


  • Strategy : 인터페이스나 추상 클래스로 외부에서 동일한 방식으로 메소드를 호출하는 방법을 명시
  • ConcreateStrategyA, B : Strategy에서 명시한 메소드를 실제로 구현한 클래스
  • Context : Strategy를 이용하는 역할. 필요에 따라 동적으로 구체적인 전략을 바꿀 수 있도록 setter 속성을 포함

Example

UML_Class_2

초기 오리 시뮬레이션 UML 클래스


초기 디자인은 Duck 슈퍼 클래스를 만든 다음, 그 클래스를 확장하여 서로 다른 종류의 자식 클래스로 구성되어 있다.

Problem

이 다음, 오리를 날게하기 위해 fly() 메소드를 추가하는 과정에서 문제가 발생한다.

서브 클래스들 중 RobberDuck 클래스(고무 오리)는 날지 못하고, DecoyDuck 클래스(가짜 오리)는 날지도 못하고 꽥꽥거리기도 못한다.

  1. 상속으로 서브 클래스들에게 날게하는 기능을 추가하는 경우
UML_Class_3

슈퍼 클래스에 나는 기능을 추가한 UML 클래스


  1. 인터페이스로 기능을 분리한 다음 서브 클래스들에 추가하는 경우
UML_Class_4

인터페이스로 기능을 추가한 UML 클래스


위의 경우들로 문제를 해결하려 할 때 2가지 문제가 발생한다.

  • 기존의 코드 내용을 수정하게 된다(OCP 법칙 위배).
  • 서브 클래스 간에 코드가 중복된다.

Solution

각 행동은 인터페이스로 표현하고 이런 인터페이스를 사용해서 행동을 구현한다(IFlyBehavior, IQuackBehavior).

나는 행동과 꽥꽥거리는 행동은 Duck 클래스에서 구현하지 않는다.

UML_Class_5

인터페이스로 기능을 분리하고 행동을 구현한 UML 클래스


위의 방법으로 디자인하면 다른 형식의 객체에서도 나는 행동과 꽥꽥거리는 행동을 재사용할 수 있다. 그리고 기존의 행동 클래스를 수정하거나 날아다니는 행동을 사용하는 클래스를 전혀 건드리지 않고도 새로운 행동을 추가할 수 있다.

UML_Class_6

행동 클래스를 통합한 UML 클래스


Duck 클래스에 fly() 메소드와 quack() 메소드 대신 performFly() 메소드와 performQuack() 메소드를 사용해서 행동을 직접 처리하는 대신 인터페이스로 참조되는 객체에 그 행동을 위임한다.

Code

Clone this wiki locally