๐ Chapter 8: ์์กด์ฑ ๊ด๋ฆฌํ๊ธฐ
- ํ๋ ฅ์ ํ์์ ์ด์ง๋ง ๊ณผ๋ํ ํ๋ ฅ์ ์ค๊ณ๋ฅผ ๊ณค๊ฒฝ์ ๋น ํธ๋ฆด ์ ์๋ค. ํ๋ ฅ์ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ํด ์๊ฒ์ ๊ฐ์ํ๋ค.
- ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋ ฅํ๊ธฐ ์ํด์๋ ๊ทธ๋ฐ ๊ฐ์ฒด๊ฐ ์กด์ฌํ๋ค๋ ์ฌ์ค์ ์๊ณ ์์ด์ผ ํ๋ค. ๊ฐ์ฒด๊ฐ ์์ ํ ์ ์๋ ๋ฉ์์ง์ ๋ํด์๋ ์๊ณ ์์ด์ผ ํ๋ค. ์ด๋ฐ ์ง์์ด ๊ฐ์ฒด ์ฌ์ด์ ์์กด์ฑ์ ๋ณ๋๋ค.
๐ ์์กด์ฑ ์ดํดํ๊ธฐโ
๐ ๋ณ๊ฒฝ๊ณผ ์์กด์ฑโ
- ์์กด์ฑ์ ์คํ ์์ ๊ณผ ๊ตฌํ ์์ ์ ์๋ก ๋ค๋ฅธ ์๋ฏธ๋ฅผ ๊ฐ์ง๋ค.
- ์คํ ์์ : ์์กดํ๋ ๊ฐ์ฒด๊ฐ ์ ์์ ์ผ๋ก ๋์ํ๊ธฐ ์ํด์๋ ์คํ ์์ ์์กด ๋์ ๊ฐ์ฒด๊ฐ ๋ฐ๋์ ์กด์ฌํด์ผ ํ๋ค.
- ๊ตฌํ ์์ : ์์กด ๋์ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ ์์กดํ๋ ๊ฐ์ฒด๋ ํจ๊ป ๋ณ๊ฒฝ๋๋ค.
- ๋ค์์
PeriodCondition
ํด๋์ค์isSatisfiedBy
๋ฉ์๋๋Screening
์ธ์คํด์ค์๊ฒgetStartTime
๋ฉ์์ง๋ฅผ ์ ์กํ๋ค.
public class PeriodCondition implements DiscountCondition {
private DayOfWeek dayOfWeek;
private LocalTime startTime;
private LocalTime endTime;
//...
public boolean isSatisfiedBy(Screening screening) {
return screening.getStartTime().getDayOfWeek().equals(dayOfWeek) &&
startTime.compareTo(screening.getStartTime().toLocalTime()) <= 0 &&
endTime.compareTo(screening.getStartTime().toLocalTime()) >= 0;
}
}
- ์คํ ์์ ์
PeriodCondition
์ ์ธ์คํด์ค๊ฐ ์ ์์ ์ผ๋ก ๋์ํ๊ธฐ ์ํด์๋Screening
์ ์ธ์คํด์ค๊ฐ ์กด์ฌํด์ผ ํ๋ค. ๋ง์ฝScreening
์ธ์คํด์ค๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด ์์ํ๋ ๋๋ก ๋์ํ์ง ์์ ๊ฒ์ด๋ค. - ์ด์ฒ๋ผ ์ด๋ค ๊ฐ์ฒด๊ฐ ์์ ๋ ์์ ์ ์ ์์ ์ผ๋ก ์ํํ๊ธฐ ์ํด ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํ์๋ก ํ๋ ๊ฒฝ์ฐ ๋ ๊ฐ์ฒด ์ฌ์ด์ ์์กด์ฑ์ด ์กด์ฌํ๋ค๊ณ ๋งํ๋ค. ์์กด์ฑ์ ๋ฐฉํฅ์ฑ์ ๊ฐ์ง๋ฉฐ ํญ์ ๋จ๋ฐฉํฅ์ด๋ค.
- ์ด ๊ฒฝ์ฐ
PeriodCondition
์Screening
์ ์์กดํ๋ค. - ๋ ์์ ์ฌ์ด์ ์์กด์ฑ์ ์์กด๋๋ ์์๊ฐ ๋ณ๊ฒฝ๋ ๋ ์์กดํ๋ ์์๋ ํจ๊ป ๋ณ๊ฒฝ๋ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ ์์กด์ฑ์ ๋ณ๊ฒฝ์ ์ํ ์ํฅ์ ์ ํ ๊ฐ๋ฅ์ฑ์ ์์ํ๋ค.
๐ ์์กด์ฑ ์ ์ดโ
- ์์กด์ฑ์ ์ ์ด๋ ์ ์๋๋ฐ,
Screening
์ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ฉดScreening
์ดMovie
,LocalDateTime
,Customer
์ ์์กดํ๋ค. ์์กด์ฑ ์ ์ด๊ฐ ์๋ฏธํ๋ ๊ฒ์PeriodCondition
์ดScreening
์ ์์กดํ ๊ฒฝ์ฐPeriodCondition
์Screening
์ด ์์กดํ๋ ๋์์ ๋ํด์๋ ์๋์ ์ผ๋ก ์์กดํ๊ฒ ๋๋ค ๊ฒ์ด๋ค. - ์์กด์ฑ์ ํจ๊ป ๋ณ๊ฒฝ๋ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์กด์ฑ์ด ์ ์ด๋๋ ๊ฒ์ ์๋๋ค. ์์กด์ฑ์ด ์ค์ ๋ก ์ ์ด๋ ์ง ์ฌ๋ถ๋ ๋ณ๊ฒฝ์ ๋ฐฉํฅ๊ณผ ์บก์ํ์ ์ ๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค. ๋ง๊ฑ
Screening
์ด ์์กดํ๊ณ ์๋ ์ด๋ค ์์์ ๊ตฌํ์ด๋ ์ธํฐํ์ด์ค๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ์ ๋ด๋ถ ๊ตฌํ์ ํจ๊ณผ์ ์ผ๋ก ์บก์ํํ๊ณ ์๋ค๋ฉดScreening
์ ์์กดํ๊ณ ์๋PeriodCondition
๊น์ง๋ ๋ณ๊ฒฝ์ด ์ ํ๋์ง ์์ ๊ฒ์ด๋ค. - ์์กด์ฑ์ ์ ์ด๋ ์ ์๊ธฐ ๋๋ฌธ์ ์์กด์ฑ์ ์ข
๋ฅ๋ฅผ ์ง์ ์์กด์ฑ๊ณผ ๊ฐ์ ์์กด์ฑ์ผ๋ก ๋๋๊ธฐ๋ ํ๋ค. ์ง์ ์์กด์ฑ์ด๋ ํ ์์๊ฐ ๋ค๋ฅธ ์์์ ์ง์ ์์กดํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ๋ฆฌํจ๋ค. (
PeriodCondition
์ดScreening
์ ์์กด, ์ฝ๋์ ๋ช ์์ ์ผ๋ก ๋ค์ด๋๋ค.) ๊ฐ์ ์์กด์ฑ์ด๋ ์ง์ ์ ์ธ ๊ด๊ณ๋ ์กด์ฌํ์ง ์์ง๋ง ์์กด์ฑ ์ ์ด์ ์ํด ์ํฅ์ด ์ ํ๋๋ ๊ฒฝ์ฐ ๋ฅผ ๊ฐ๋ฆฌํจ๋ค. (์ฝ๋ ์์ ๋ช ์์ ์ผ๋ก ๋๋ฌ๋์ง ์๋๋ค.)
๐ ๋ฐํ์ ์์กด์ฑ๊ณผ ์ปดํ์ผํ์ ์์กด์ฑโ
- ๋จผ์ ๋ฐํ์๊ณผ ์ปดํ์ผํ์์ ์๋ฏธ๋ฅผ ์ดํดํด์ผ ํ๋ค.
- ๋ฐํ์์ ์ ํ๋ฆฌ์ผ์ด์ ์คํ๋๋ ์์ ์ ๊ฐ๋ฆฌํจ๋ค.
- ์ปดํ์ผํ์์ ์ผ๋ฐ์ ์ผ๋ก ์์ฑ๋ ์ฝ๋๋ฅผ ์ปดํ์ผํ๋ ์์ ์ ๊ฐ๋ฆฌํค์ง๋ง ๋ฌธ๋งฅ์ ๋ฐ๋ผ์๋ ์ฝ๋ ๊ทธ ์์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ๋ ํ๋ค.
- ์ปดํ์ผํ์ ์์กด์ฑ์ด๋ผ๋ ์ฉ์ด๊ฐ ์ค์ํ๊ฒ ์๊ฐํ๋ ๊ฒ์ ์๊ฐ์ด ์๋๋ผ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋์ ๊ตฌ์กฐ์ด๋ค. ๋ํ ๋์ ํ์ ์ธ์ด์ ๊ฒฝ์ฐ์๋ ์ปดํ์ผํ์์ด ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ปดํ์ผํ์ ์์กด์ฑ์ด๋ผ๋ ์ฉ์ด๋ฅผ ์ค์ ๋ก ์ปดํ์ผ์ด ์ํ๋๋ ์์ ์ผ๋ก ์ดํดํ๋ฉด ์๋ฏธ๊ฐ ๋ชจํธํด์ง ์ ์๋ค.
- ๊ฐ์ฒด์งํฅ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐํ์์ ์ฃผ์ธ๊ณต์ ๊ฐ์ฒด๋ค. ๋ฐ๋ผ์ ๋ฐํ์ ์์กด์ฑ์ด ๋ค๋ฃจ๋ ์ฃผ์ ๋ ๊ฐ์ฒด ์ฌ์ด์ ์์กด์ฑ์ด๋ค. ๋ฐ๋ฉด ์ฝ๋ ๊ณผ์ ์์ ์ฃผ์ธ๊ณต์ ํด๋์ค๋ค. ๋ฐ๋ผ์ ์ปดํ์ผํ์ ์์กด์ฑ์ด ๋ค๋ฃจ๋ ์ฃผ์ ๋ ํด๋์ค ์ฌ์ด์ ์์กด์ฑ์ด๋ค.
- ์ด์ ์ ์ํ ์๋งค ์์คํ
์์
Movie
๋ ๋น์จ ํ ์ธ ์ ์ฑ ๊ณผ ๊ธ์ก ํ ์ธ ์ ์ฑ ๋ชจ๋๋ฅผ ์ ์ฉํ๊ฒ ์ค๊ณํ๋ค. ์ด๋ Movie๋ ์ถ์ ํด๋์ค์ธDiscountPolicy
์ ์์กดํ๋๋ก ํด๋์ค ๊ด๊ณ๋ฅผ ์ค๊ณํ๋ค.DiscountPolicy
๋AmountDiscountPolicy
์PercentDiscountPolicy
๊ฐ ์์๋ฐ์๋ค. - ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์
Movie
๋AmountDiscountPolicy
๋PercentDiscountPolicy
ํด๋์ค๋ก ํฅํ๋ ์ด๋ค ์์กด์ฑ๋ ์กด์ฌํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ์ค์ง ์ถ์ ํด๋์ค์ธDiscountPolicy
ํด๋์ค์๋ง ์์กดํ๋ค. - ํ์ง๋ง ๋ฐํ์ ์์กด์ฑ์ ์ดํด๋ณด๋ฉด ๊ธ์ก ํ ์ธ ์ ์ฑ
์ ์ ์ฉํ๊ธฐ ์ํด์๋
AmountDiscountPolicy
์ ์ธ์คํด์ค์ ํ๋ ฅํด์ผํ๊ณ ๋น์จ ํ ์ธ ์ ์ฑ ์ ์ ์ฉํ๊ธฐ ์ํด์๋PercentDiscountPolicy
์ ์ธ์คํด์ค์ ํ๋ ฅํด์ผ ํ๋ค. - ์ฝ๋๋ฅผ ์์ฑํ๋ ์์ ์
Movie
ํด๋์ค๋ ์ด ๋ ํด๋์ค์ ์กด์ฌ์ ๋ํด ์ ํ ์์ง ๋ชปํ์ง๋ง ์คํ ์์ ์Movie
์ธ์คํด์ค๋AmountDiscountPolicy
์ธ์คํด์ค์PercentDiscountPolicy
์ธ์คํด์ค์ ํ๋ ฅํ ์ ์์ด์ผ ํ๋ค. - ์ด ๋ ํด๋์ค์ ์ธ์คํด์ค์ ํจ๊ป ํ๋ ฅํ ์ ์ด์ ๋ง๋๋ ๋ ๋์ ๋ฐฉ๋ฒ์
Movie
๊ฐ ๋ ํด๋์ค ์ค ์ด๋ค ๊ฒ๋ ์์ง ๋ชปํ๊ฒ ๋ง๋๋ ๊ฒ์ผ๋กDiscountPolicy
๋ผ๋ ์ถ์ ํด๋์ค์ ์์กดํ๋๋ก ๋ง๋ค๊ณ ์ด ์ปดํ์ผํ์ ์์กด์ฑ์ ์คํ ์์PercentDiscountPolicy
์ธ์คํด์ค๋AmountDiscountPolicy
์ธ์คํด์ค์ ๋ํ ๋ฐํ์ ์์กด์ฑ์ผ๋ก ๋์ฒดํด์ผ ํ๋ค. - ์ด๋ค ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋ค์ํ ํด๋์ค์ ์ธ์คํด์ค์ ํ๋ ฅํ๊ธฐ ์ํด์๋ ํ๋ ฅํ ์ธ์คํด์ค์ ๊ตฌ์ฒด์ ์ธ ํด๋์ค๋ฅผ ์์์๋ ์ ๋๋ค. ์ค์ ๋ก ํ๋ ฅํ ๊ฐ์ฒด๊ฐ ์ด๋ค ๊ฒ์ธ์ง๋ ๋ฐํ์์ ํด๊ฒฐํด์ผ ํ๋ค.
- ์ปดํ์ผํ์ ๊ตฌ์กฐ์ ๋ฐํ์ ๊ตฌ์กฐ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๊ฐ ๋ฉ๋ฉด ๋ฉ์๋ก ์ค๊ณ๊ฐ ์ ์ฐํด์ง๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํด์ง๋ค.
๐ ์ปจํ ์คํธ ๋ ๋ฆฝ์ฑโ
- ํด๋์ค๊ฐ ํน์ ํ ๋ฌธ๋งฅ ์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋ ์๋ก ๋ค๋ฅธ ๋ฌธ๋งฅ์์ ์ฌ์ฉํ๊ธฐ๋ ๋ ์ด๋ ค์์ง๋ค. ํด๋์ค๊ฐ ์ฌ์ฉ๋ ํน์ ํ ๋ฌธ๋งฅ์ ๋ํด ์ต์ํ์ ๊ฐ์ ๋ง์ผ๋ก ์ด๋ค์ ธ ์๋ค๋ฉด ๋ค๋ฅธ ๋ฌธ๋งฅ์์ ์ฌ์ฌ์ฉํ๊ธฐ๊ฐ ๋ ์์ํด์ง๋ค. ์ด๋ฅผ ์ปจํ ์คํธ ๋ ๋ฆฝ์ฑ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์ค๊ณ๊ฐ ์ ์ฐํด์ง๊ธฐ ์ํด์๋ ๊ฐ๋ฅํ ํ ์์ ์ด ์คํ๋ ์ปจํ ์คํธ์ ๋ํ ๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ฅผ ์ต๋ํ ์ ๊ฒ ์์์ผ ํ๋ค.
๐ ์์กด์ฑ ํด๊ฒฐํ๊ธฐโ
- ์ปดํ์ผํ์ ์์กด์ฑ์ ๊ตฌ์ฒด์ ์ธ ๋ฐํ์ ์์กด์ฑ์ผ๋ก ๋์ฒด๋ผ์ผ ํ๋ค.
- ์ปดํ์ผํ์ ์์กด์ฑ์ ์คํ ์ปจํ
์คํธ์ ๋ง๋ ์ ์ ํ ๋ฐํ์ ์์กด์ฑ์ผ๋ก ๊ต์ฒดํ๋ ๊ฒ์ ์์กด์ฑ ํด๊ฒฐ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์์กด์์ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ธ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
- ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์ ์ ์์ฑ์๋ฅผ ํตํด ์์กด์ฑ ํด๊ฒฐ
- ๊ฐ์ฒด ์์ฑ ํ
setter
๋ฉ์๋๋ฅผ ํตํด ์์กด์ฑ ํด๊ฒฐ - ๋ฉ์๋ ์คํ ์ ์ธ์๋ฅผ ์ด์ฉํ์ฌ ์์กด์ฑ ํด๊ฒฐ
- ๋ค์๊ณผ ๊ฐ์ด
Movie
๊ฐ์ฒด๋ฅผ ์์ฑํ ๋AmountDiscountPolicy
๋PercentDiscountPolicy
์ ์ธ์คํด์ค๋ฅผMovie
์ ์์ฑ์์ ์ธ์๋ก ์ ๋ฌํ๋ฉด ๋๋ค.
Movie avatar = new Movie("์๋ฐํ",
Duration.ofMinutes(120),
Money.wons(10000),
new AmountDiscountPolicy(...)
);
Movie starWars = new Movie("์คํ์์ฆ",
Duration.ofMinutes(180),
Money.wons(11000),
new PercentDiscountPolicy(...)
);
- ์ด ๊ฒฝ์ฐ
Movie
๋ ์์ฑ์๋ฅผ ์ ์ํ๋ค.
public class Movie {
public Movie(String title, Duration runningTime, Money fee, DiscountPolicy discountPolicy) {
// ...
this.discountPolicy = discountPolicy;
}
}
Movie
์ธ์คํด์ค๋ฅผ ์์ฑํ ํ์ ๋ฉ์๋๋ฅผ ์ด์ฉํด ์์กด์ฑ์ ํด๊ฒฐํ ์๋ ์๋ค.
Movie avatar = new Movie(...);
avatar.setDiscountPolicy(new AmountDiscountPolicy(...));
- ์ด ๊ฒฝ์ฐ
setter
๋ฉ์๋๋ฅผ ์ ๊ณตํด์ผ ํ๋ค.
public class Movie {
public void setDiscountPolicy (DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}
}
setter
๋ฉ์๋๋ฅผ ์ด์ฉํ๋ ๋ฐฉ๋ฒ์ ์คํ ์์ ์ ์์กด ๋์์ด ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๊ณ์ ์ข ๋ ์ ์ฐํ๊ฒ ๋ง๋ค ์ ์๋ค. ๋จ์ ์ ๊ฐ์ฒด๊ฐ ์์ฑ๋ ํ์ ํ๋ ฅ์ ํ์ํ ์์กด ๋์์ ์ค์ ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์์กด ๋์์ ์ค์ ํ๊ธฐ ์ ๊น์ง๋ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ถ์์ ํ ์ ์๋ค๋ ์ ์ด๋ค.- ๋๋ฌธ์ ๋ ์ข์ ๋ฐฉ๋ฒ์ ์์ฑ์ ๋ฐฉ์๊ณผ
setter
๋ฐฉ์์ ํผํฉํ๋ ๊ฒ์ด๋ค. ํญ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ ์์กด์ฑ์ ํด๊ฒฐํด์ ์์ ํ ์ํ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ, ํ์์ ๋ฐ๋ผsetter
๋ฉ์๋๋ฅผ ์ด์ฉํด ์์กด ๋์์ ๋ณ๊ฒฝํ ์ ์๊ฒ ํ ์ ์๋ค.
Movie avatar = new Movie("์๋ฐํ",
Duration.ofMinutes(120),
Money.wons(10000),
new AmountDiscountPolicy(...)
);
// ...
avatar.setDiscountPolicy(new AmountDiscountPolicy(...));
Movie
๊ฐ ํญ์ ํ ์ธ ์ ์ฑ ์ ์ ํ์๊น์ง๋ ์๊ณ ๊ฐ๊ฒฉ์ ๊ณ์ฐํ ๋๋ง ์ผ์์ ์ผ๋ก ์์๋ ๋ฌด๋ฐํ๋ค๋ฉด ๋ฉ์๋์ ์ธ์๋ฅผ ์ด์ฉํด ์์กด์ฑ์ ํด๊ฒฐํ ์๋ ์๋ค.
public class Movie {
public Money calculateMovieFee(Screening screening, DiscountPolicy discountPolicy) {
return fee.minus(discountPolicy.calculateDiscountAmount(screening));
}
}
๐ ์ ์ฐํ ์ค๊ณโ
๐ ์ ์กด์ฑ๊ณผ ๊ฒฐํฉ๋โ
- ๊ฐ์ฒด๋ค์ด ํ๋ ฅํ๊ธฐ ์ํด์๋ ์๋ก์ ์กด์ฌ์ ์ํ ๊ฐ๋ฅํ ์ฑ ์์ ์์์ผ ํ๋ค. ์ด๋ฐ ์ง์๋ค์ด ๊ฐ์ฒด ์ฌ์ด์ ์์กด์ฑ์ ๋ณ๋๋ค. ๋ฐ๋ผ์ ๋ชจ๋ ์์กด์ฑ์ด ๋์ ๊ฒ์ ์๋๋ค. ํ์ง๋ง ์์กด์ฑ์ด ๊ณผํ๋ฉด ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค.
- ์์กด์ฑ์ ํ๋ ฅ์ ์ํด ๋ฐ๋์ ํ์ํ ๊ฒ์ด๋ค. ๋จ์ง ๋ฐ๋์งํ์ง ๋ชปํ ์์กด์ฑ์ด ๋ฌธ์ ์ผ ๋ฟ์ด๋ค.
- ์ฌ๊ธฐ์ ๋ฐ๋์งํ ์์กด์ฑ์ ์ฌ์ฌ์ฉ์ฑ๊ณผ ๊ด๋ ค์ด ์๋๋ฐ ์ด๋ค ์์กด์ฑ์ด ๋ค์ํ ํ๊ฒฝ์์ ํด๋์ค๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ์ ํํ๋ค๋ฉด ๊ทธ ์์กด์ฑ์ ๋ฐ๋์งํ์ง ๋ชปํ ๊ฒ์ด๋ค. ๋ค์ ๋งํด ์ปจํ ์คํธ์ ๋ ๋ฆฝ์ ์ธ ์์กด์ฑ์ ๋ฐ๋์งํ ์์กด์ฑ์ด๊ณ ํน์ ํ ์ปจํ ์คํธ์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋ ์์กด์ฑ์ ๋ฐ๋์งํ์ง ์์ ์์กด์ฑ์ด๋ค.
- ๋ค๋ฅธ ํ๊ฒฝ์์ ์ฌ์ฌ์ฉํ๊ธฐ ์ํด ๋ด๋ถ ๊ตฌํ์ ๋ณ๊ฒฝํ๊ฒ ๋ง๋๋ ๋ชจ๋ ์์กด์ฑ์ ๋ฐ๋์งํ์ง ์์ ์์กด์ฑ์ด๋ค. ๋ฐ๋์งํ ์์กด์ฑ์ด๋ ์ปจํ ์คํธ์ ๋ ๋ฆฝ์ ์ธ ์์กด์ฑ์ ์๋ฏธํ๋ฉฐ ๋ค์ํ ํ๊ฒฝ์์ ์ฌ์ฌ์ฉ๋ ์ ์๋ ๊ฐ๋ฅ์ฑ์ ์ด์ด๋๋ ์์กด์ฑ์ ์๋ฏธํ๋ค.
- ์ด๋ค ๋ ์์ ์ฌ์ด์ ์กด์ฌํ๋ ์์กด์ฑ์ด ๋ฐ๋์งํ ๋ ๋ ์์๊ฐ ๋์จํ ๊ฒฐํฉ๋ ๋๋ ์ฝํ ๊ฒฐํฉ๋๋ฅผ ๊ฐ์ง๋ค๊ณ ๋งํ๋ค. ๋ฐ๋๋ก ๋ ์์ ์ฌ์ด์ ์์กด์ฑ์ด ๋ฐ๋์งํ์ง ๋ชปํ ๋ ๋จ๋จํ ๊ฒฐํฉ๋ ๋๋ ๊ฐํ ๊ฒฐํฉ๋๋ฅผ ๊ฐ์ง๋ค๊ณ ๋งํ๋ค.
๐ ์ง์์ด ๊ฒฐํฉ์ ๋ณ๋๋ค.โ
- ๊ฒฐํฉ๋์ ์ ๋๋ ํ ์์๊ฐ ์์ ์ด ์์กดํ๊ณ ์๋ ๋ค๋ฅธ ์์์ ๋ํด ์๊ณ ์๋ ์ ๋ณด์ ์์ผ๋ก ๊ฒฐ์ ๋๋ค. ๋ง์ฝ ๋ง์ ์ ๋ณด๋ฅผ ์๊ณ ์์ผ๋ฉด ๊ฐํ๊ฒ ๊ฒฐํฉ๋๊ณ ๋ฐ๋๋ก ์ ์ ์ ๋ณด๋ฅผ ์๊ณ ์์ผ๋ฉด ์ฝํ๊ฒ ๊ฒฐํฉ๋๋ค.
- ์๋ก์ ๋ํด ์๊ณ ์๋ ์ง์์ ์์ด ๊ฒฐํฉ๋๋ฅผ ๊ฒฐ์ ํ๋ค.
- ๋ ๋ง์ด ์๊ณ ์๋ค๋ ๊ฒ์ ๋ ์ ์ ์ปจํ ์คํธ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๊ฒฐํฉ๋๋ฅผ ๋์จํ๊ฒ ์ ์งํ๋ ค๋ฉด ํ๋ ฅํ๋ ๋์์ ๋ํด ๋ ์ ๊ฒ ์์์ผ ํ๋ค. ๋ํ, ํ๋ ฅํ๋ ๋์์ ๋ํด ํ์ํ ์ ๋ณด ์ธ์๋ ์ต๋ํ ๊ฐ์ถ๋ ๊ฒ์ด ์ค์ํ๋ค.
- ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ ์ถ์ํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
๐ ์ถ์ํ์ ์์กดํ๋ผโ
- ์ถ์ํ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ฌ ๋ค๋ฃจ๊ฐ ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋ถํ์ํ ์ ๋ณด๋ฅผ ๊ฐ์ถ ์ ์๋ค. ๋ฐ๋ผ์ ๋์์ ๋ํด ์์์ผ ํ๋ ์ง์์ ์์ ์ค์ผ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฒฐํฉ๋๋ฅผ ๋์จํ๊ฒ ์ ์งํ ์ ์๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์ถ์ํ์ ๊ฒฐํฉ๋์ ๊ด์ ์์ ์์กด ๋์์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ๋ถํ๋ ๊ฒ์ด ์ ์ฉํ๊ณ ๋ชฉ๋ก์์ ์๋์ชฝ์ผ๋ก ๊ฐ์๋ก ํด๋ผ์ด์ธํธ๊ฐ ์์์ผ ํ๋ ์ง์์ ์์ด ์ ์ด์ง๊ธฐ ๋๋ฌธ์ ๊ฒฐํฉ๋๊ฐ ๋์จํด์ง๋ค.
- ๊ตฌ์ฒด ํด๋์ค ์์กด์ฑ
- ์ถ์ ํด๋์ค ์์กด์ฑ
- ์ธํฐํ์ด์ค ์์กด์ฑ
- ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ์คํ ์ปจํ ์คํธ์ ๋ํด ์์์ผ ํ๋ ์ ๋ณด๋ฅผ ์ค์ผ์๋ก ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋ค๋ ๊ฒ์ด๋ค.
๐ ๋ช ์์ ์ธ ์์กด์ฑโ
- ์๋ ์ฝ๋๋ ํ ๊ฐ์ง ์ค์๋ก ์ธํด ๊ฒฐํฉ๋๊ฐ ๋ถํ์ํ๊ฒ ๋์์ก๋ค.
public class Movie {
// ...
private DiscountPolicy discountPolicy;
public Movie(String title, Duration runningTime, Money fee) {
// ...
this.discountPolicy = new AmountDiscountPolicy(...);
}
}
discountPolicy
๋DiscountPolicy
ํ์ ์ผ๋ก ์ ์ธ๋ผ ์์ง๋ง ์์ฑ์์์ ๊ตฌ์ฒด ํด๋์ค์ธAmountDiscountPolicy
์ ์ธ์คํด์ค๊ฐ ์ง์ ์์ฑํด์ ๋์ ํ๊ณ ์๋ค. ๋ฐ๋ผ์Movie
๋ ์ถ์ ํด๋์ค์ธDiscountPolicy
๋ฟ๋ง ์๋๋ผ ๊ตฌ์ฒด ํด๋์ค์ธAmountDiscountPolicy
์๋ ์์กดํ๊ฒ ๋๋ค.- ํด๊ฒฐํ๊ธฐ ์ํด์ ํด๋์ค ์์์ ๊ตฌ์ฒด ํด๋์ค์ ๋ํ ๋ชจ๋ ์์กด์ฑ์ ์ ๊ฑฐํด์ผ๋ง ํ๋ค.
- ๋ค์์ ์์ฑ์๋ฅผ ์ฌ์ฉํด ์์กด์ฑ์ ํด๊ฒฐํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ํ๋ธ ๊ฒ์ด๋ค.
public class Movie {
// ...
private DiscountPolicy discountPolicy;
public Movie(String title, Duration runningTime, Money fee, DiscountPolicy discountPolicy) {
// ...
this.discountPolicy = discountPolicy;
}
}
- ์์ฑ์์ ์ธ์๋ก
DiscountPolicy
์ ์์ ํด๋์ค ์ค ์ด๋ค ๊ฒ์ด๋ผ๋ ์ ๋ฌํ ์ ์๋ค. ๋ฐ๋ผ์ ๋ฐํ์์AmountDiscountPolicy
์ ์ธ์คํด์ค๋PercentDiscountPolicy
์ ์ธ์คํด์ค๋ฅผ ์ ํ์ ์ผ๋ก ์ ๋ฌํ ์ ์๋ค. - ์์กด์ฑ์ ๋์์ผ๋ก ์์ฑ์์ ์ธ์๋ก ์ ๋ฌ๋ฐ๋ ๋ฐฉ๋ฒ๊ณผ ์์ฑ์ ์์์ ์ง์ ์์ฑํ๋ ๋ฐฉ๋ฒ ์ฌ์ด์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค๋ฅผ ํตํด ํ ์ธ ์ ์ฑ
์ ์ค์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋์ง ์ฌ๋ถ๋ค. ์์ฑ์์ ์ธ์๋ก ์ ์ธํ๋ ๋ฐฉ๋ฒ์
Movie
๊ฐDiscountPolicy
์ ์์กดํ๋ค๋ ์ฌ์ค์Movie
์ ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค์ ๋๋ฌ๋ด๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ๋ช ์์ ์ธ ์์กด์ฑ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. - ๋ฐ๋ฉด
Movie
๋ด๋ถ์์AmountDiscountPolicy
์ ์ธ์คํด์ค๋ฅผ ์ง์ ์์ฑํ๋ ๋ฐฉ์์Movie
๊ฐDiscountPolicy
์ ์์กดํ๋ค๋ ์ฌ์ค์ ๊ฐ์ถ๋ค. ๋ค์ ๋งํด ์์กด์ฑ์ด ํผ๋ธ๋ฆฐ ์ธํฐํ์ด์ค์ ํํ๋์ง ์๋๋ค. ์ด๋ฅผ ์จ๊ฒจ์ง ์์กด์ฑ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์์กด์ฑ์ด ๋ช ์์ ์ด์ง ์์ผ๋ฉด ์์กด์ฑ์ ํ์ ํ๊ธฐ ์ํด ๋ฐฐ๊ตฌ ๊ตฌํ์ ์ง์ ์ดํด๋ณผ ์๋ฐ์ ์๋ค. - ์์กด์ฑ์ ๋ช ์์ ์ผ๋ก ๋๋ฌ๋ด๋ฉด ์ฝ๋๋ฅผ ์ง์ ์์ ํด์ผ ํ๋ ์ํ์ ํผํ ์ ์๋ค. ์คํ ์ปจํ ์คํธ์ ์ ์ ํ ์์กด์ฑ์ ์ ํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ช ์์ ์ธ ์์กด์ฑ์ ์ฌ์ฉํด์ผ๋ง ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ปดํ์ผํ์ ์์กด์ฑ์ ์ ์ ํ ๋ฐํ์ ์์กด์ฑ์ผ๋ก ๊ต์ฒดํ ์ ์๋ค.
๐ new๋ ํด๋กญ๋คโ
new
๋ฅผ ์๋ชป ์ฌ์ฉํ๋ฉด ํด๋์ค ์ฌ์ด์ ๊ฒฐํฉ๋๊ฐ ๊ทน๋จ์ ์ผ๋ก ๋์์ง๋ค. ๊ฒฐํฉ๋ ์ธก๋ฉด์์new
๊ฐ ํด๋ก์ด ์ด์ ๋ ํฌ๊ฒ ๋ ๊ฐ์ง์ด๋ค.new
์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๊ตฌ์ฒด ํด๋์ค์ ์ด๋ฆ์ ์ง์ ๊ธฐ์ ํด์ผ ํ๋ค. ๋ฐ๋ผ์new
๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ๋ ์ถ์ํ๊ฐ ์๋ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ ์๋ฐ์ ์๊ธฐ ๋๋ฌธ์ ๊ฒฐํฉ๋๊ฐ ๋์์ง๋ค.new
์ฐ์ฐ์๋ ์์ฑํ๋ ค๋ ๊ตฌ์ฒด ํด๋์ค๋ฟ๋ง ์๋๋ผ ์ด๋ค ์ธ์๋ฅผ ์ด์ฉํด ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํด์ผ ํ๋์ง๋ ์์์ผ ํ๋ค. ๋ฐ๋ผ์new
๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ๊ฐ ์์์ผ ํ๋ ์ง์์ ์์ด ๋์ด๋๊ธฐ ๋๋ฌธ์ ๊ฒฐํฉ๋๊ฐ ๋์์ง๋ค.
- ๊ตฌ์ฒด ํด๋์ค์ ์ง์ ์์กดํ๋ฉด ๊ฒฐํฉ๋๊ฐ ๋์์ง๋ค. ์ฌ๊ธฐ์
new
๋ ๋ฌธ์ ๋ฅผ ๋ ํฌ๊ฒ ๋ง๋๋๋ฐ ํด๋ผ์ด์ธํธ๋ ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์์ฑํ๋ ๋ฐ ์ด๋ค ์ ๋ณด๊ฐ ํ์ํ์ง์ ๋ํด์๋ ์์์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. new
๋ ๊ฒฐํฉ๋๋ฅผ ๋์ด๊ธฐ ๋๋ฌธ์ ํด๋กญ๋ค. ํ๋ ฅํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ธฐ ์ํด ์ด๋ค ์ธ์๋ค์ด ํ์ํ๊ณ ๊ทธ ์ธ์๋ค์ ์ด๋ค ์์๋ก ์ฌ์ฉํด์ผ ํ๋์ง์ ๋ํ ์ ๋ณด๋ ๋ ธ์ถ์ํฌ๋ฟ๋ง ์๋๋ผ ์ธ์๋ก ์ฌ์ฉ๋๋ ๊ตฌ์ฒด ํด๋์ค์ ๋ํ ์์กด์ฑ์ ์ถ๊ฐํ๋ค.- ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋ก์ง๊ณผ ์์ฑ๋ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ ๋ก์ง์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค.
- ์ธ๋ถ์์ ์ธ์คํด์ค๋ฅผ ์ ๋ฌ๋ฐ๋ ๋ฐฉ๋ฒ์ ์์กด์ฑ ํด๊ฒฐ ๋ฐฉ๋ฒ๊ณผ ๋์ผํ๊ฒ ์์ฑ์์ ์ธ์๋ก ์ ๋ฌํ๊ฑฐ๋,
setter
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ์คํ ์์ ๋ฉ์๋์ ์ธ์๋ก ์ ๋ฌํ๋ฉด ๋๋ค. - ์ฌ์ฉ๊ณผ ์์ฑ์ ์ฑ ์์ ๋ถ๋ฆฌํ๊ณ , ์์กด์ฑ์ ์์ฑ์์ ๋ช ์์ ์ผ๋ก ๋๋ฌ๋ด๊ณ , ๊ตฌ์ฒด ํด๋์ค๊ฐ ์๋ ์ถ์ ํด๋์ค์ ์์กดํ๊ฒ ํจ์ผ๋ก์จ ์ค๊ณ๋ฅผ ์ ์ฐํ๊ฒ ๋ง๋ค ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ถ๋ฐ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ฑ ์์ ๊ฐ์ฒด ๋ด๋ถ๊ฐ ์๋๋ผ ํด๋ผ์ด์ธํธ๋ก ์ฎ๊ธฐ๋ ๊ฒ์ ์์ํ๋ค๋ ์ ์ ๊ธฐ์ตํ๋ผ.
๐ ๊ฐ๋์ ์์ฑํด๋ ๋ฌด๋ฐฉํ๋คโ
- ํด๋์ค ์์์ ๊ฐ์ฑ์ ์ธ์คํด์ค๋ฅผ ์ง์ ์์ฑํ๋ ๋ฐฉ์ ์ด ์ ์ฉํ ๊ฒฝ์ฐ๋ ์๋ค. ์ฃผ๋ก ํ๋ ฅํ๋ ๊ฐ๋ณธ ๊ฐ์ฒด๋ฅผ ์ค์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ์ฌ๊ธฐ์ ์ํ๋ค.
- ์๋ฅผ ๋ค์ด,
Movie
๊ฐ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์๋AmountDiscountPolicy
์ ์ธ์คํด์ค์ ํ๋ ฅํ๊ณ ๊ฐ๋์ฉ๋งPercentDiscountPolicy
์ ์ธ์คํด์ค์ ํ๋ ฅํ๋ค๊ณ ๊ฐ์ ํ๋ค. ๋ง์ฝ ์ด ์ํฉ์์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ์ฑ ์์ ํด๋ผ์ด์ธํธ๋ก ์ฎ๊ธด๋ค๋ฉด ํด๋ผ์ด์ธํธ๋ค ์ฌ์ด์ ์ค๋ณต ์ฝ๋๊ฐ ๋์ด๋๊ณMovie
์ ์ฌ์ฉ์ฑ๋ ๋๋น ์ง ๊ฒ์ด๋ค. - ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๊ธฐ๋ณธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์์ฑ์๋ฅผ ์ถ๊ฐํ๊ณ ์ด ์์ฑ์์์
DiscountPolicy
์ ์ธ์คํด์ค๋ฅผ ์ธ์๋ก ๋ฐ๋ ์์ฑ์๋ฅผ ์ฒด์ด๋ํ๋ ๊ฒ์ด๋ค.
public class Movie {
// ...
private DiscountPolicy discountPolicy;
public Movie(String title, Duration runningTime) {
// ๋ ๋ฒ์งธ ์์ฑ์ ํธ์ถ
// ์์ฑ์๊ฐ ์ฒด์ธ์ฒ๋ผ ์ฐ๊ฒฐ
this(title, runningTime, fee, new AmountDiscountPolicy(...));
}
public Movie(String title, Duration runningTime, Money fee, DiscountPolicy discountPolicy) {
// ...
this.discountPolicy = discountPolicy;
}
}
- ์ด ๋ฐฉ๋ฒ์ผ๋ก ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ก๋ฉํ๋ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ ์ ์๋ค.
public class Movie {
public Money calculateMovieFee(Screening screening) {
return calculateMovieFee(screening, new AmountDiscountPolicy(...));
}
public Money calculateMovieFee(Screening screening, DiscountPolicy discountPolicy) {
return fee.minus(discountPolicy.calculateDiscountAmount(screening));
}
}
- ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ๊ฒ ๋๋๋ผ๋ ํด๋์ค์ ์ฌ์ฉ์ฑ์ด ๋ ์ค์ํ๋ค๋ฉด ๊ฒฐํฉ๋๋ฅผ ๋์ด๋ ๋ฐฉํฅ์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค. ๊ทธ๋ผ์๋ ๊ฐ๊ธ์ ๊ตฌ์ฒด ํด๋์ค์ ๋ํ ์์กด์ฑ์ ์ ๊ฑฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด๋ ๊ฒ์ด ์ข๋ค.
๐ ํ์ค ํด๋์ค์ ๋ํ ์์กด์ ํด๋กญ์ง ์๋คโ
- ์๋ฐ๋ผ๋ฉด JDK์ ํฌํจ๋ ํ์ค ํด๋์ค ์ฆ, ๋ณ๊ฒฝ๋ ํ๋ฅ ์ด ๊ฑฐ์ ์๋ ํด๋์ค๋ ์์กด์ฑ์ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
- ์ด๋ฐ ํด๋์ค๋ค์ ๋ํด์๋ ๊ตฌ์ฒด ํด๋์ค์ ์์กดํ๊ฑฐ๋ ์ง์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋๋ผ๋ ๋ฌธ์ ๊ฐ ์๋ค.
public abstract class DiscountPolicy {
private List<DiscountCondition> conditions = new ArrayList<>();
public void switchConditions(List<DiscountCondition> conditions) {
this.conditions = conditions;
}
}
๐ ์ปจํ ์คํธ ํ์ฅํ๊ธฐโ
- ๋ค์ ์์ ์์๋ ๋ค๋ฅธ ์ปจํ
์คํธ์์
Movie
๋ฅผ ํ์ฅํด์ ์ฌ์ฌ์ฉํ๋ ๋ ๊ฐ์ง ์๋ฅผ ๋ณธ๋ค. ํ๋๋ ํ ์ธ ํํ์ ์ ๊ณตํ์ง ์๋ ์ํ์ด๊ณ ๋ค๋ฅธ ํ๋๋ ๋ค์์ ํ ์ธ ์ ์ฑ ์ ์ค๋ณตํด์ ์ ์ฉํ๋ ์ํ์ด๋ค. - ์ฒซ ๋ฒ์งธ๋ ํ ์ธ ํํ์ ์ ๊ณตํ์ง ์๋ ์ํ์ ์๋งค ์๊ธ์ ๊ณ์ฐํ๋ ๊ฒฝ์ฐ๋ค.
- ํ ์ธ ์ ์ฑ
์ด ์กด์ฌํ์ง ์๋๋ค๋ ์ฌ์ค์ ํ ์ธ ์ ์ฑ
์ ํ ์ข
๋ฅ๋ก ๊ฐ์ฃผํ์ฌ
NoneDiscountPolicy
ํด๋์ค๋ฅผ ์ถ๊ฐํ๊ณDiscountPolicy
์ ์์ ํด๋์ค๋ก ๋ง๋ ๋ค.
public class NoneDiscountPolicy extends DiscountPolicy {
@Override
protected Money getDiscountAmount(Screening screening) {
return Money.ZERO;
}
}
- ์ด์ ๋ค์๊ณผ ๊ฐ์ด
NoneDiscountPolicy
์ ์ธ์คํด์ค๋ฅผMovie
์ ์์ฑ์์ ์ ๋ฌํ๋ค.
Movie avatar = new Movie("์๋ฐํ",
Duration.ofMinutes(120),
Money.wons(10000),
new NoneDiscountPolicy()
);
- ๋ ๋ฒ์งธ ์๋ ์ค๋ณต ์ ์ฉ์ด ๊ฐ๋ฅํ ํ ์ธ ์ ์ฑ ์ ๊ตฌํํ๋ ๊ฒ์ด๋ค. (๊ธ์ก ํ ์ธ ์ ์ฑ ๊ณผ ๋น์จ ํ ์ธ ์ ์ฑ ์ ํผํฉ ์ ์ฉ)
- ์ด ๋ฌธ์ ๋
NoneDiscountPolicy
์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์๋๋ฐ ์ค๋ณต ํ ์ธ ์ ์ฑ ์ ํ ์ธ ์ ์ฑ ์ ํ ๊ฐ์ง๋ก ๊ฐ์ฃผํ๋ค.
public class OverlappedDiscountPolicy extends DiscountPolicy {
private List<DiscountPolicy> discountPolicies = new ArrayList<>();
public OverlappedDiscountPolicy(DiscountPolicy ...discountPolicies) {
this.discountPolicies = Arrays.asList(discountPolicies);
}
@Override
protected Money getDiscountAmount(Screening screening) {
Money result = Money.ZERO;
for(DiscountPolicy each : discountPolicies) {
result = result.plus(each.calculateDiscountAmount(screening));
}
return result;
}
}
- ์ด์
OverlappedDiscountPolicy
์ ์ธ์คํด์ค๋ฅผ ์์ฑํด์Movie
์ ์ ๋ฌํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ค๋ณต ํ ์ธ์ ์ฝ๊ฒ ์ ์ฉํ ์ ์๋ค.
Movie avatar = new Movie("์๋ฐํ",
Duration.ofMinutes(120),
Money.wons(10000),
new OverlappedDiscountPolicy(
new AmountDiscountPolicy(...),
new PercentDiscountPolicy(...)
)
);
- ์ค๊ณ๋ฅผ ์ ์ฐํ๊ฒ ๋ฏผ๋ค ์ ์์๋ ์ด์ ๋
Movie
๊ฐDiscountPolicy
๋ผ๋ ์ถ์ํ์ ์์กดํ๊ณ , ์์ฑ์๋ฅผ ํตํดDiscountPolicy
์ ๋ํ ์์กด์ฑ์ ๋ช ์์ ์ผ๋ก ๋๋ฌ๋์ผ๋ฉฐ,new
์ ๊ฐ์ด ๊ตฌ์ฒด ํด๋์ค๋ฅผ ์ง์ ์ ์ผ๋ก ๋ค๋ค์ผ ํ๋ ์ฑ ์์Movie
์ธ๋ถ๋ก ์ฎ๊ฒผ๊ธฐ ๋๋ฌธ์ด๋ค.
๐ ์กฐํฉ ๊ฐ๋ฅํ ํ๋โ
- ์ด๋ค ๊ฐ์ฒด์ ํ๋ ฅํ๋๋์ ๋ฐ๋ผ ๊ฐ์ฒด์ ํ๋์ด ๋ฌ๋ผ์ง๋ ๊ฒ์ ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ค๊ณ๊ฐ ๊ฐ์ง ํน์ง์ด๋ค.
- ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ค๊ณ๋ ์์ง๋ ๋์ ์ฑ ์๋ค์ ๊ฐ์ง ์์ ๊ฐ์ฒด๋ค์ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ฐ๊ฒฐํจ์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ํ์ฅํ ์ ์๋ค.
- ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ค๊ณ๋ ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ(how) ํ๋์ง๋ฅผ ๋์ดํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ฒด๋ค์ ์กฐํฉ์ ํตํด ๋ฌด์(what)์ ํ๋์ง๋ฅผ ํํํ๋ ํด๋์ค๋ค๋ก ๊ตฌ์ฑ๋๋ค. ๋ฐ๋ผ์ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ์ฝ๋๋ฅผ ๋ณด๋ ๊ฒ๋ง์ผ๋ก๋ ๊ฐ์ฒด๊ฐ ์ด๋ค ์ผ์ ํ๋์ง๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์๋ค. ๋ค์ ๋งํด ์ ์ธ์ ์ผ๋ก ๊ฐ์ฒด์ ํ๋์ ์ ์ํ ์ ์๋ ๊ฒ์ด๋ค.
- ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ค๊ณ๋ ์์ ๊ฐ์ฒด๋ค์ ํ๋์ ์กฐํฉํจ์ผ๋ก์จ ์๋ก์ด ํ๋์ ์ด๋์ด๋ผ ์ ์๋ ์ค๊ณ๋ค. ํ๋ฅญํ ๊ฐ์ฒด์งํฅ ์ค๊ณ๋ ๊ฐ์ฒด๊ฐ ์ด๋ป๊ฒ ํ๋์ง๋ฅผ ํํํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ฒด๋ค์ ์กฐํฉ์ ์ ์ธ์ ์ผ๋ก ํํํจ์ผ๋ก์จ ๊ฐ์ฒด๋ค์ด ๋ฌด์์ ํ๋์ง๋ฅผ ํํํ๋ ์ค๊ณ๋ค.
- ์ด๋ฌํ ์ค๊ณ๋ฅผ ์ฐฝ์กฐํ๋ ๋ฐ ์์ด์์ ํต์ฌ์ ์์กด์ฑ์ ๊ด๋ฆฌํ๋ ๊ฒ์ด๋ค.