public abstract class Duck {
FlyBehavior flyBehavior;
QuackBehavior quackBehavior;
//행동 인터페이스 형식의 레퍼런스 변수 2개를 선언함.
//같은 패키지에 속하는 모든 서브클래스에서 이 변수를 상속 받음.
public Duck(){}
public abstract void display();
//아래 두 행동 클래스에 위임함.
public void performFly(){
flyBehavior.fly();
}
public void performDuck(){
quackBehavior.quack();
}
public void swim(){
System.out.println("모든 오리는 물에 뜹니다. 가짜 오리도 뜨죠.");
}
//아래의 두 메소드를 호출하면 언제든지 오리의 행동을 즉석에서 바꿀 수 있음.
public void setFlyBehavior(FlyBehavior fb){
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb){
quackBehavior = qb;
}
}
나는 행동과 꽥꽥거리는 행동의 인터페이스
public interface FlyBehavior {
//모든 나는 행동의 클래스에서 구현
public void fly();
}
public interface QuackBehavior {
public void quack();
}
나는 행동 인터페이스를 위임받는 클래스들
public class FlyWithWings implements FlyBehavior{
public void fly(){
System.out.println("날고 있어요!");
}
}
public class FlyNoWay implements FlyBehavior{
public void fly(){
System.out.println("저는 못 날아요!");
}
}
public class FlyRocketPowered implements FlyBehavior{
public void fly() {
System.out.println("로켓 추진으로 날아갑니다.");
}
}
꽥꽥거리는 행동 인터페이스를 위임받는 클래스들
public class Quack implements QuackBehavior{
public void quack(){
System.out.println("꽥");
}
}
public class Squeak implements QuackBehavior{
public void quack() {
System.out.println("삑");
}
}
특징이 다른 오리들
public class MallardDuck extends Duck{
public MallardDuck(){
quackBehavior = new Quack(); //꽥꽥거리는 행동은 quack 객체에 위임됨.
flyBehavior = new FlyWithWings();
}
public void display(){
System.out.println("저는 물오리입니다.");
}
}
public class ModelDuck extends Duck {
public ModelDuck(){
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
public void display(){
System.out.println("저는 모형 오리입니다.");
}
}
public class MuteQuack implements QuackBehavior{
public void quack() {
System.out.println("<<조용>>");
}
}
테스트 해보기
public class MiniDuckSimulator {
public static void main(String[] args){
Duck mallard = new MallardDuck();
mallard.performDuck();
mallard.performFly();
Duck model = new ModelDuck();
model.performFly();
model.setFlyBehavior(new FlyRocketPowered()); //상속받은 세터 메소드가 호출됨.
model.performFly();
}
}
공부한 책 : 헤드퍼스트 디자인패턴