요구사항 : 오리가 날 수 있는 기능을 추가해주세요.

시도1 : 오리의 모든 행동을 구현한 슈퍼클래스에 fly()를 추가

시도2 : 추가 기능을 Flyable, Quackable 인터페이스를 사용해 해당 기능을 사용하는 오리만 인터페이스를 구현하기

시도3 : 변화하는 부분 뽑아내기

시도3을 구현한 코드이다. 객체지향적인 관점에서 주목해야할 것은 변화하는 부분을 책임으로 분리해 별도의 객체에 할당한 점이다.

// 나는 행위와 관련된 객체들
// 타입은 FlyBehavior이다.
public interface FlyBehavior {
    public void fly();
}
public class FlyWithWings implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("날고 있어요!!");
    }
}
public class FlyNoWay implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("저는 못 날아요");
    }
}

// 우는 행위와 관련된 객체들
// 타입은 QuackBehavior이다.
public interface QuackBehavior {
    public void quack();
}
public class Quack implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("꽥");
    }
}
public class MuteQuack implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("<< 조용~ >>");
    }
}