fly() 메서드를 각각 구현하면 코드 중복 발생FlyBehavior 인터페이스를 만들어 fly() 기능을 개별적으로 구현전략 패턴을 적용하여 유연한 설계를 할 수 있음.
public class Duck {
public void quack() {
System.out.println("꽥꽥!");
}
public void swim() {
System.out.println("오리가 수영합니다.");
}
public void fly() {
System.out.println("오리가 날아갑니다.");
}
}
fly() 메서드를 가지지만, 날지 못하는 오리도 존재함fly() 메서드를 재정의하면 코드 중복 발생// 날기 행동 인터페이스
public interface FlyBehavior {
void fly();
}
// 날 수 있는 오리 행동
public class FlyWithWings implements FlyBehavior {
public void fly() {
System.out.println("오리가 날아갑니다!");
}
}
// 날지 못하는 오리 행동
public class FlyNoWay implements FlyBehavior {
public void fly() {
System.out.println("저는 날지 못해요.");
}
}
// 오리 기본 클래스
public abstract class Duck {
FlyBehavior flyBehavior;
public void performFly() {
flyBehavior.fly();
}
public void setFlyBehavior(FlyBehavior fb) {
this.flyBehavior = fb;
}
}
// 특정 오리 종류
public class MallardDuck extends Duck {
public MallardDuck() {
flyBehavior = new FlyWithWings();
}
}
fly() 메서드를 인터페이스로 분리하여 재사용 가능setFlyBehavior()를 통해 런타임에 행동을 변경할 수 있음