본문 바로가기

Programming/헤드퍼스트 디자인패턴

chapter 01. 디자인패턴 들어가며 - 오리 시뮬레이션

[헤드퍼스트 디자인패턴] 54쪽 오리코드 테스트

 

파일명 용도/특징
Duck.java 슈퍼클래스(추상클래스)
MallardDuck.java 서브클래스
FlyBehavior.java  인터페이스
FlyNoWay.java 행동구현 클래스
FlyWithWings.java 행동구현 클래스

QuackBehavior.java
인터페이스
MuteQuack.java 행동구현 클래스
Squeak.java 행동구현 클래스
MiniDuckSimulator.java 클래스

 

 

 

Duck.java 

public abstract class Duck { //슈퍼(부모)클래스가 될 클래스
	
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior; 
	//행동 인터페이스 형식의 레퍼런스 변수 2개를 선언합니다. 
    //같은 패키지에 속하는 모든 서브클래스에서 이 변수를 상속 받습니다.


	public Duck() {}
	public abstract void display(); //추상 메소드 (모든 오리의 형태가 다르므로 추상메소드로 선언)	
	
	public void performFly() {
		flyBehavior.fly(); //행동 클래스에 위임한다
	}
	public void performQuack() {
		quackBehavior.quack(); //행동 클래스에 위임한다
	}
	
	public void swim() {
		System.out.println("모든 오리는 물에 뜹니다. 가짜 오리도 뜨죠.");
	}
	
}

MallardDuck.Java (Duck 클래스의 서브클래스)

public class MallardDuck extends Duck { //Duck 클래스를 상속받는다
	public MallardDuck() {
		quackBehavior = new Quack();
		flyBehavior = new FlyWithWings();
	}
	public void display() {
		System.out.println("저는 물오리 입니다.");
	}
}

FlyBehavior.java (인터페이스)

public interface FlyBehavior {
	public void fly();
}

FlyNoWay.java (FlyBehavior 인터페이스의 행동 구현 클래스)

public class FlyNoWay implements FlyBehavior{ 
	public void fly() {
		System.out.println("저는 못 날아요.");
	}
}

FlyWithWings.java  (FlyBehavior 인터페이스의 행동 구현 클래스)

public class FlyWithWings implements FlyBehavior {
	public void fly() {
		System.out.println("날고 있어요!");
	}
}

QuackBehavior.java (인터페이스)

public interface QuackBehavior {
	public void quack();
}

Quack.java (QuackBehavior 인터페이스의 행동구현 클래스)

public class Quack implements QuackBehavior{
	public void quack() {
		System.out.println("꽥");
	}
}

MuteQuack.java (QuackBehavior 인터페이스의 행동구현 클래스)

public class MuteQuack implements QuackBehavior{
	public void quack() {
		System.out.println("조용~");
	}
}

Squeak.java (QuackBehavior 인터페이스의 행동구현 클래스)

public class Squeak implements QuackBehavior{
	public void quack() {
		System.out.println("삑");
	}
}

MiniDuckSimulator.java (작성한 클래스들 테스트)

public class MiniDuckSimulator {
	public static void main(String[] args) {
		Duck mallard = new MallardDuck(); //객체생성
		mallard.performQuack();
		mallard.performFly();
	}
}