스트래티지(Strategy) 패턴 - JunpilPark/DesignPatternStudy GitHub Wiki

스트래티지 패턴에서는 알고리즘 군을 정의하고 가각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 스트래티지를 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다.

  1. 바뀌는 부분과 그렇지 않은 부분을 분리하여 변하는 부분을 캡슐화. 예제 소스코드를 보면 Duck 클래스에서 Fly() - 날기 와 Quack() - 울기 가 달라지는 것을 알 수 있다. 따라서 Duck 클래스에서 Fly()와 Quack()를 분리해서 각 행동을 나타낼 클래스 집합을 새로 만들었다.

  2. 행동 디자인은 구현이 아닌 인터페이스에 맞추어서 디자인. 그렇게 FlyBehavior, QuackBehavior 인터페이스를 만들게 되었다. 이 인터페이스를 implement 하여 구체적인 나는 행동, 우는 행동들을 클래스로 만들고 Duck 이라는 추상클래스를 만들었다.
    그리고, 상위 형식에 맞추어 프로그래밍하라 라는 원칙대로 추상클래스나 인터페이스 같은 상위 형식으로 변수를 선언했다. 그렇게 해야 객체를 변수에 대입할 때 어떤 객체든 집어 넣을 수 있기 때문이다.
    변수를 선언하는 클래스에서 실제 객체의 형식을 몰라도 된다.

    Duck 클래스 내에 보면 FlyBehavior = new FlyWithWings() 부분이 있다. 이것은 위에서 이야기 한 상위 형식인 인터페이스로 객체를 선언하고, 서브 클래스인 객체들 중 아무 객체를 대입하는 부분이다.

  3. 타클래스에 fly(), quack()의 위임 Duck 클래스에 나는 행동과 꽥꽥 소리 내는 행동을 정의한 메소그를 써서 구현하지 않고 다른 클래스에 위임한다. 즉, performFly(), perfomQuack() 메소드를 보면 참조되는 객체의 fly와 quack 메소드를 실행 시키기만 한다. 여기서는 객체의 종류 = 어떻게 울고, 어떻게 나는지 는 상관없다. 다만 quack(), fly()를 실행시킬 수만 있으면된다.