'헤드 퍼스트 디자인 패턴'을 정리한 내용입니다.
전략 패턴(Strategy Pattern)은 알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 쓸 수 있게 해줍니다.
전략 패턴을 사용하면 클라이언트로부터 알고리즘을 분리해서 독립적으로 변경할 수 있습니다.
슈퍼클래스가 아래와 같이 존재한다고 가정한다.
Duck
quack()
swim()
display()
고무 오리, 러버덕 과 같은 오리가 위의 Duck을 상속받는다고 하자.
Duck에 fly()를 추가하는 경우, 하위의 모든 오리에 적용되는 결과가 발생한다.
고무 오리와 러버덕을 울지도 날지도 못하지만 fly()와 quack()의 실행이 가능해진다.
Duck
quack()
swim()
display()
fly()
----------------------------
RubberDuck
quack() { // 삑삑}
fly() {// 날지 않도록 오버라이드}
----------------------------
DecoyDuck
quack() {// 울지 않도록 오버라이드}
fly() {// 날지 않도록 오버라이드}
Duck
swim()
display()
// fly, quack 제거
----------------------------
Flyable
fly()
----------------------------
Quackable
quack()
----------------------------
RubberDuck
display()
quack() // 오버라이딩
----------------------------
MallardDuck
display()
fly() // 오버라이딩
quack() // 오버라이딩
fly()와 quack()을 제외한 부분은 공통이다.
fly()와 quack()을 분리해야 한다.
Duck
FlyVehavior flyVehavior
QuackBehavior quackBehavior
----------------------------
FlyVehavior
fly()
----------------------------
FlyWithWings
fly() {// 하늘을 나는 방법 구현}
----------------------------
FlyNoWay
fly*( {// 못 날아요~}
----------------------------
QuackBehavior
quack()
----------------------------
Quack
quack() {// 꽥꽥}
----------------------------
Squeak
quack() {// 삑삑}
----------------------------
MuteQuack
quack() {// 소리를 못내요~}
Dock
public void setFlyBehavior(FlyBehavior fb) {
flyBehavior = fb;
}
----------------------------
Main
Duck model = new RubberDuck();
model.setFlyBehavior(new FlyWithWings());
위와 같이 동적으로 행동을 지정해 설정할 수 있다.