상속의 문제점
public abstract class Duck {
public void quack();
public void swim();
protected void display();
}
public class MallardDuck extends Duck {
@Overried
}
알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 스트래티지 패턴을 활용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리짐을 변경할 수 있다.
변하는 부분에 대해서는 따로 뽑아 캡슐화한다.
위 예제의 변하는 부분은
적절하게 인터페이스를 사용해서 실제 구현 클래스들을 잘 분리했다.
이걸 사용하는 client(Duck)에서는 인터페이스에 의존해서 구현을 하면 좋을 것 같다.
최종 스트래티지 패턴 구조
두 클래스를 합치는 것을 '구성(composition)을 이용한다'라고 부른다.
Duck 클래스에서는 행동을 상속받는 대신, 올바른 행동 객체로 구성되어 행동을 부여받는다.
런타임 환경에서 동적으로 알고리즘을 변경할 때 용이할 것 같다.
상속보다는 구성을 활용한다.