IT/Design Pattern

[Design Pattern] 스트래티지 패턴

지상낙원 2020. 8. 19. 04:06

(캡슐화되어 있는) 여러 가지 로직을 상황에 따라
교환하여 사용할 수 있다면 어떨까?

 

  어떤 기능 또는 알고리즘을 사용할 때 상황에 따라서 변경할 필요가 있습니다. 이럴 때 사용하면 좋은 패턴입니다. 이 패턴을 사용함으로써 사용하는 주체(클래스)는 이 기능 또는 알고리즘 로직에 대해서 세부적인 내용을 몰라도 되고, 이 로직이 변경되었을 때, 사용하는 주체는 변경 상관없이 코드 변경을 할 필요가 없습니다.

 

그림1. 스트래티지 패턴 UML (출처 : Head First Design Patterns)

 

   그림1에서 보면 Duck클래스는 fly()라는 기능을 사용하기 위해서, FlyBehavior 인터페이스를 구성(composition)합니다. 그리고 Duck클래스의 구상클래스인 RubberDuck이나 DecoyDuck의 생성자에서 FlyBehavior의 인스턴스인 flyBehavior를 용도에 따라서 FlyWithWings또는 FlyNoWay으로 객체 생성할 것입니다.


  또는 물론 FlyNoWay 객체 생성했다가 나중에 바꿀 수도 있습니다. setFlyBehavior(new FlyWithWings()) 으로 객체 변경도 가능합니다. 예를 들면, RubberDuck으로 객체를 생성하였는데, 이 객체는 날지 못하는 고무오리 였는데, 날개를 달아서 날도록 할 수 있는 것입니다.

 

  이와 같은 패턴으로 다른 것에도 적용할 수 있을 것입니다.
  1) 게임 내의 주인공이 상황에 따라 무기를 변경하기
      (Weapon - Sword, Axe, BowAndArrow)

  2) 미지의 함수에 대한 근을 구하기
      (FindRoot - Bisection, NewtonRaphson)

  3) 배열 상태에 따라 정렬방법 선택하기
      (SortMethod - Bubble, Select, Insert, Quick, Merge, Counting)

  4) 남편이 아내로부터 살아 남기 위한 방법
      (HusbandSurvival - WashingDish, DoLaundry, PlayWithChildren)