1. 컴파일 시간 의존성과 실행 시간 의존성

2. 다형성

3. 추상화

4. 좀 더 유연한 설계

1. 컴파일 시간 의존성과 실행 시간 의존성

1-1) DiscountPolicy 상속 계층 Image

Untitled

1-2) 의존성 구분

1-3) Movie의 객체가 실행시점에 알게 되는 AmountDiscountPolicy와 PercentDiscountPolicy

1-3)-1. Movie의 금액할인 정책일 때

/* Movie 객체 생성시 받아야할 값들.
	(String title, Duration runningTime, Money fee, 
		DiscountPolicy discountPolicy)
*/
Movie avatar = new Movie("아바타", Durantion.ofMinutes(120),
	Money.wons(10000), new AmountDiscountPolicy(Money.wons(800), ...));

1-3)-2. Movie의 비율할인 정책일 때

/* Movie 객체 생성시 받아야할 값들.
	(String title, Duration runningTime, Money fee, 
		DiscountPolicy discountPolicy)
*/
Movie avatar = new Movie("아바타", Durantion.ofMinutes(120),
	Money.wons(10000), new PercentDiscountPolicy(0.1, ...));

1-3)-3. Movie의 의존성

2. 다형성

2-1) 메시지

2-2) 인터페이스와 다형성 Image

Untitled

3. 추상화

3-1) 추상화의 힘 Image

4. 좀 더 유연한 설계

4-1) Movie class

Untitled

4-2) NoneDiscountPolicy class

Untitled

4-3) 객체 생성

// Movie 
public Movie(String title, Duration runningTime, Money fee, 
															DiscountPolicy discountPolicy) {
    this.title = title;
    this.runningTime = runningTime;
    this.fee = fee;
    this.discountPolicy = discountPolicy;
}

Movie starWars = new Moive(
	"스타워즈", Duration.ofMinutes(210),
	Money.wons(10000),
	// 새로운 클래스를 추가한 것만으로 애플리케이션의 기능을 확장했음. 
	new NoneDiscountPolicy()
);

4-4) 추상화 설계가 가능한 이유