Strategy pattern example code

 

Remarks

이 글은 Head First Design Patterns를 기반으로 작성되었습니다.


Strategy pattern을 이용하여 구현한 오리 시뮬레이터 code입니다. Original code의 UML diagram은 다음과 같습니다.

  • 상속: head가 차있는 solid line으로 표현
  • 구성(composition): head가 빈 solid line으로 표현
  • 인터페이스(구현): head가 차 있는 dash line으로 표현
// Duck.java

public abstract class Duck {
    protected Duck() {}  // called only in subclass

    public abstract void display();                                       // 1. 각 subclass 마다 다름
    public void swim() { System.out.println("모든 오리는 물에 뜹니다."); }  // 2. 모든 subclass에 공통
    public void fly() { flyBehavior.fly(); }                              // 3. 행동 집합으로 나뉘어짐
    public void quack() { quackBehavior.quack(); }                        //    이 경우, composition을 활용하여 캡슐화

    protected FlyBehavior flyBehavior;  // called only in subclass
    protected QuackBehavior quackBehavior;
}
// FlyBehavior.java

public interface FlyBehavior {
    void fly();  // 'public' is redundant
}

class FlyNoWay implements FlyBehavior {
    public void fly() { System.out.println("저는 못 날아요."); }
}

class FlyRocketPowered implements FlyBehavior {
    public void fly() { System.out.println("저는 못 날아요."); }
}
// QuackBehavior.java

public interface QuackBehavior {
    void quack();
}

class MuteQuack implements QuackBehavior {
    public void quack() { System.out.println("(조용..)"); }
}
// ModelDuck.java

public class ModelDuck extends Duck {
    public ModelDuck() {
        flyBehavior = new FlyNoWay();
        quackBehavior = new MuteQuack();
    }
    public void display() { System.out.println("귀여운 모델오리 입니다."); }
}
// Simulator.java

public class Simulator {
    public static void main(String[] argv) {
        Duck modelDuck = new ModelDuck();

        modelDuck.display();
        modelDuck.swim();
        modelDuck.fly();
        modelDuck.quack();
    }
}