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();
}
}
PREVIOUSEtc