[Java] interface 활용 오리 객체들을 만들어보자

JTI·2022년 11월 8일
0

📌 Code list

목록 보기
24/55
post-thumbnail

💡 설계원칙

  • 어플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리시킨다.

    바뀌는 부분은 따로 뽑아서 캡슐화!

  • 구현이 아닌 인터페이스에 맞추어 프로그래밍 하라
  • 이후 바뀌지 않는 부분에 영향을 미치지 않은 채로 그 부분만 고치거나 확장 가능해진다.

🐥 오리 문제에 적용

  • 바뀌는 부분
  1. 하늘을 나는 행동
  2. 꽥꽥 거리는 행동
  • 바뀌지 않는 부분
  1. 나머지 행동들

💡 적용방법

  • 바뀌는 행동을 분리하자
  • 행동을 동적으로 바꿀 수 있게 설계: Setter

✏️ 오리 객체들 코드 시작

<클래스 다이어그램>

//나냐 못나냐 구별
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();
	}

}
profile
Fill in my own colorful colors🎨

0개의 댓글