바뀌는 부분은 따로 뽑아서 캡슐화!
- 바뀌는 부분
- 하늘을 나는 행동
- 꽥꽥 거리는 행동
- 바뀌지 않는 부분
- 나머지 행동들
<클래스 다이어그램>
//나냐 못나냐 구별
interface FlyBehavior {
void fly();
}
//날 수 있는 오리
class FlyWithWing implements FlyBehavior {
@Override
public void fly() {
System.out.println("훨훨 ~~");
}
}
//날지 못하는 오리
class FlyNoWay implements FlyBehavior {
@Override
public void fly() {
System.out.println("난 못날아 ...");
}
}
//소리내냐 안내냐
interface QuackBehavior {
void quack();
}
//꽥꽥 오리
class Quack implements QuackBehavior {
@Override
public void quack() {
System.out.println("꽥꽥");
}
}
//삑삑 오리
class Squeak implements QuackBehavior {
@Override
public void quack() {
System.out.println("삑삑");
}
}
//소리 안내는 오리
class MuteQuack implements QuackBehavior {
@Override
public void quack() {
System.out.println("<<Silence>>");
}
}
//==================================================================================================
//오리 객체
abstract class Duck {
private FlyBehavior flyBehavior;
private QuackBehavior quackBehavior;
//생긴 모양 구상
public abstract void display();
public void swim() {
System.out.println("어퓨어퓨");
}
//나는 메서드 가져와서 출력
public void perfomFly() {
flyBehavior.fly();
}
//소리 메서드 가져와서 출력
public void perfomQuack() {
quackBehavior.quack();
}
public FlyBehavior getFlyBehavior() {
return flyBehavior;
}
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public QuackBehavior getQuackBehavior() {
return quackBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
}
//청동오리
class MallarDuck extends Duck {
public MallarDuck() {
setQuackBehavior(new Quack());
setFlyBehavior(new FlyWithWing());
}
@Override
public void display() {
System.out.println("청동오리");
}
}
//빨간머리오리
class RedHeadDuck extends Duck {
public RedHeadDuck() {
setQuackBehavior(new Squeak());
setFlyBehavior(new FlyWithWing());
}
@Override
public void display() {
System.out.println("빨간머리오리");
}
}
//러버덕
class RubberDuck extends Duck {
public RubberDuck() {
setQuackBehavior(new MuteQuack());
setFlyBehavior(new FlyNoWay());
}
@Override
public void display() {
System.out.println("러버덕");
}
}
//장난감덕
class DecoyDuck extends Duck {
public DecoyDuck() {
setQuackBehavior(new MuteQuack());
setFlyBehavior(new FlyNoWay());
}
@Override
public void display() {
System.out.println("난 장난감덕");
}
}
public class DuckTest {
public static void main(String[] args) {
RubberDuck r = new RubberDuck();
r.perfomFly();
}
}