๐ Chapter 6: ๋ฉ์์ง์ ์ธํฐํ์ด์ค
- ํ๋ฅญํ ๊ฐ์ฒด์งํฅ ์ฝ๋๋ฅผ ์ป๊ธฐ ์ํด์๋ ํด๋์ค๊ฐ ์๋๋ผ ๊ฐ์ฒด๋ฅผ ์งํฅํด์ผ ํ๋ค. ์ข ๋ ์ ํํ๊ฒ ๋งํด์ ํ๋ ฅ ์์์ ๊ฐ์ฒด๊ฐ ์ํํ๋ ์ฑ ์์ ์ด์ ์ ๋ง์ถฐ์ผ ํ๋ค. ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ์ฑ ์์ด ๊ฐ์ฒด๊ฐ ์์ ํ ์ ์๋ ๋ฉ์์ง์ ๊ธฐ๋ฐ์ด ๋๋ค๋ ๊ฒ์ด๋ค.
๐ ํ๋ ฅ๊ณผ ๋ฉ์์งโ
๐ ํด๋ผ์ด์ธํธ-์๋ฒ ๋ชจ๋ธโ
- ํ๋ ฅ์ ์ด๋ค ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ๋ฌด์ธ๊ฐ๋ฅผ ์์ฒญํ ๋ ์์๋๋๋ฐ ๋ฉ์์ง๋ ๊ฐ์ฒด ์ฌ์ด์ ํ๋ ฅ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋งค๊ฐ์ฒด๋ค.
- ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์ ๊ทผํ ์ ์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ฉ์์ง๋ฅผ ์ ์กํ๋ ๊ฒ๋ฟ์ด๋ค.
- ๋ ๊ฐ์ฒด ์ฌ์ด์ ํ๋ ฅ ๊ด๊ณ๋ฅผ ์ค๋ช ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ ํต์ ์ธ ๋ฉํํฌ๋ ํด๋ผ์ด์ธํธ-์๋ฒ ๋ชจ๋ธ์ด๋ค. (๋ฉ์์ง๋ฅผ ์ ์กํ๋ ๊ฐ์ฒด๋ ํด๋ผ์ด์ธํธ, ๋ฉ์์ง๋ฅผ ์์ ํ๋ ๊ฐ์ฒด๋ ์๋ฒ / ๋จ๋ฐฉํฅ ์ํธ์์ฉ)
- ํ๋ ฅ์ ๊ด์ ์์ ๊ฐ์ฒด๋ ๋ ๊ฐ์ง ์ข ๋ฅ์ ๋ฉ์์ง ์งํฉ์ผ๋ก ๊ตฌ์ฑ๋๋๋ฐ ํ๋๋ ๊ฐ์ฒด๊ฐ ์์ ํ๋ ๋ฉ์์ง์ ์งํฉ์ด๊ณ ๋ค๋ฅธ ํ๋๋ ์ธ๋ถ์ ๊ฐ์ฒด์๊ฒ ์ ์กํ๋ ๋ฉ์์ง์ ์งํฉ์ด๋ค.
- ๊ฐ์ฒด๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์ํํ ์ ์๋ ๊ฒ๋ณด๋ค ๋ ํฐ ์ฑ ์์ ์ํํ๊ธฐ ์ํด์๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ํ๋ ฅํด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๊ฐ์ฒด ์ฌ์ด์ ํ๋ ฅ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ๋งค๊ฒ์ฒด๊ฐ ๋ฐ๋ก ๋ฉ์์ง์ด๋ค.
๐ ๋ฉ์์ง์ ๋ฉ์์ง ์ ์กโ
- ๋ฉ์์ง๋ ๊ฐ์ฒด๋ค์ด ํ๋ ฅํ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ ์ ์ผํ ์์ฌ์ํต ์๋จ์ด๋ค.
- ๋ฉ์์ง ์ ์ก(๋ฉ์์ง ํจ์ฑ)์ ํ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ๋์์ ์์ฒญํ๋ ๊ฒ์ด๋ค.
- ๋ฉ์์ง ์ ์ก์๋ ๋ฉ์์ง๋ฅผ ์ ์กํ๋ ๊ฐ์ฒด์ด๋ค. (ํด๋ผ์ด์ธํธ)
- ๋ฉ์์ง ์์ ์๋ ๋ฉ์์ง๋ฅผ ์์ ํ๋ ๊ฐ์ฒด์ด๋ค. (์๋ฒ)
- ๋ฉ์์ง๋ ์คํผ๋ ์ด์ ๋ช ๊ณผ ์ธ์๋ก ๊ตฌ์ฑ๋๋ฉฐ ๋ฉ์์ง ์ ์ก์ ์ฌ๊ธฐ์ ๋ฉ์์ง ์์ ์๋ฅผ ์ถ๊ฐํ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๋ฉ์์ง ์ ์ก์ ๋ฉ์์ง ์์ ์, ์คํผ๋ ์ด์ ๋ช , ์ธ์์ ์กฐํฉ์ด๋ค.
- ์๋๋ ์๋ฐ์ ์์์ด๋ค.
//์์ ์.์คํผ๋ ์ด์
๋ช
(์ธ์)
condition.isSatisfiedBy(screening);
๐ ๋ฉ์์ง์ ๋ฉ์๋โ
- ๋ฉ์์ง๋ฅผ ์์ ํ์ ๋ ์ค์ ๋ก ์คํ๋๋ ํจ์ ๋๋ ํ๋ก์์ ๋ฅผ ๋ฉ์๋๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์ฝ๋ ์์์ ๋์ผํ ์ด๋ฆ์ ๋ณ์์๊ฒ ๋์ผํ ๋ฉ์์ง๋ฅผ ์ ์กํ๋๋ผ๋ ๊ฐ์ฒด์ ํ์ ์ ๋ฐ๋ผ ์ค์ ์คํ๋๋ ๋ฉ์๋๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค.
- ๊ฐ์ฒด๋ ๋ฉ์์ง์ ๋ฉ์๋๋ผ๋ ๋ ๊ฐ์ง ์๋ก ๋ค๋ฅธ ๊ฐ๋ ์ ์คํ ์์ ์ ์ฐ๊ฒฐํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์์ ๊ณผ ์คํ ์์ ์ ์๋ฏธ๊ฐ ๋ฌ๋ผ์ง ์ ์๋ค. ๋ฉ์์ง์ ๋ฉ์๋์ ๊ตฌ๋ถ์ ๋ฉ์์ง ์ ์ก์์ ์์ ์๊ฐ ๋์จํ๊ฒ ๊ฒฐํฉ๋ ์ ์๊ฒ ํ๋ค.
- ๋ฉ์์ง ์ ์ก์๋ ์์ ์ด ์ด๋ค ๋ฉ์์ง๋ฅผ ์ ์กํด์ผ ํ๋์ง๋ง ์๋ฉด ๋๋ค. ์์ ์๋ ์ด๋ค ํด๋์ค์ ์ธ์คํด์ค์ธ์ง, ์ด๋ค ๋ฐฉ์์ผ๋ก ์์ฒญ ์ ์ฒ๋ฆฌํ๋์ง ๋ชจ๋ฅด๋๋ผ๋ ์ํํ ํ๋ ฅ์ด ๊ฐ๋ฅํ๋ค. ๋ฉ์์ง ์์ ์ ์ญ์ ๋๊ฐ ๋ฉ์์ง๋ฅผ ์ ์กํ๋์ง ์ ํ์๊ฐ ์๋ค. ๋จ์ง ๋ฉ์์ง๊ฐ ๋์ฐฉํ๋ค๋ ์ฌ์ค๋ง ์๋ฉด ๋๋ค.
๐ ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค์ ์คํผ๋ ์ด์ โ
- ์ธ๋ถ์ ๊ฐ์ฒด๋ ์ค์ง ๊ฐ์ฒด๊ฐ ๊ณต๊ฐํ๋ ๋ฉ์์ง๋ฅผ ํตํด์๋ง ๊ฐ์ฒด์ ์ํธ์์ฉํ ์ ์๋ค. ์ด์ฒ๋ผ ๊ฐ์ฒด๊ฐ ์์ฌ์ํต์ ์ํด ์ธ๋ถ์ ๊ณต๊ฐํ๋ ๋ฉ์์ง์ ์งํฉ์ ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ด์ ์์ ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค์ ํฌํจ๋ ๋ฉ์์ง๋ฅผ ์คํผ๋ ์ด์
์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ์คํผ๋ ์ด์
์ ์ํ ๊ฐ๋ฅํ ์ด๋ค ํ๋์ ๋ํ ์ถ์ํ๋ค. (
DiscountCondition
์ธํฐํ์ด์ค์ ์ ์๋isSatisfiedBy
๊ฐ ์คํผ๋ ์ด์ ์ ํด๋นํ๋ค.) - ๊ทธ์ ๋นํด ๋ฉ์์ง๋ฅผ ์์ ํ์ ๋ ์ค์ ๋ก ์คํ๋๋ ์ฝ๋๋ ๋ฉ์๋๋ผ๊ณ ๋ถ๋ฅธ๋ค. (
SequenceCondition
,PeriodCondition
์ ์ ์๋ ๊ฐ๊ฐ์isSatisfiedBy
๋ ์ค์ ๊ตฌํ์ ํฌํจํ๊ธฐ ๋๋ฌธ์ ๋ฉ์๋๋ผ๊ณ ๋ถ๋ฅธ๋ค.)
๐ ์๊ทธ๋์ฒโ
- ์คํผ๋ ์ด์ (๋๋ ๋ฉ์๋)์ ์ด๋ฆ๊ณผ ํ๋ผ๋ฏธํฐ์ ๋ชฉ๋ก์ ํฉ์ณ ์๊ทธ๋์ฒ(signature)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- ์คํผ๋ ์ด์ ์ ์คํ ์ฝ๋ ์์ด ์๊ทธ๋์ฒ๋ง ์ ์ํ ๊ฒ ์ด๋ค. ๋ฉ์๋๋ ์ด ์๊ทธ๋์ฒ์ ๊ตฌํ์ ๋ํ ๊ฒ์ด๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์์ง๋ฅผ ์์ ํ๋ฉด ์คํผ๋ ์ด์ ์ ์๊ทธ๋์ฒ์ ๋์ผํ ๋ฉ์๋๊ฐ ์คํ๋๋ค.
- ์คํผ๋ ์ด์ ์ ๊ด์ ์์ ๋คํ์ฑ์ด๋ ๋์ผํ ์คํผ๋ ์ด์ ํธ์ถ์ ๋ํด ์๋ก ๋ค๋ฅธ ๋ฉ์๋๋ค์ด ์คํ๋๋ ๊ฒ์ด๋ผ๊ณ ์ ์ํ ์ ์๋ค.
๐ ์ธํฐํ์ด์คํผ ์ค๊ณ ํ์งโ
- ์ข์ ์ธํฐํ์ด์ค๋ ์ต์ํ์ ์ธํฐํ์ด์ค์ ์ถ์์ ์ธ ์ธํฐํ์ด์ค๋ผ๋ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
- ์ต์ํ์ ์ธํฐํ์ด์ค๋ ๊ผญ ํ์ํ ์คํผ๋ ์ด์ ๋ง์ ์ธํฐํ์ด์ค์ ํฌํจํ๋ ๊ฒ์ด๊ณ ์ถ์์ ์ธ ์ธํฐํ์ด์ค๋ ์ด๋ป๊ฒ ์ํํ๋์ง๊ฐ ์๋๋ผ ๋ฌด์์ ํ๋์ง๋ฅผ ํํํ๋ค.
- ์ด๋ ๊ฒ ์ค๊ณํ ์ ์๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ฑ ์ ์ฃผ๋ ์ค๊ณ ๋ฐฉ๋ฒ์ ๋ฐ๋ฅด๋ ๊ฒ์ด๋ค. (๋ฉ์์ง๋ฅผ ๋จผ์ ์ ํํจ์ผ๋ก์จ ๋ฌด๊ดํ ์คํผ๋ ์ด์ ์ด ์ธํฐํ์ด์ค์ ์ค๋ฉฐ๋๋ ๊ฒ์ ๋ฐฉ์ง)
- ๋ฉ์์ง๊ฐ ๊ฐ์ฒด๋ฅผ ์ ํํ๊ฒ ํจ์ผ๋ก์จ ํด๋ผ์ด์ธํธ์ ์๋๋ฅผ ๋ฉ์์ง์ ํํํ ์ ์๊ฒ ํ๋ค.
๐ ๋๋ฏธํฐ ๋ฒ์นโ
- 4์ฅ์ ์ ์ฐจ์ ์ธ ๋ฐฉ์์ ์ํ ์๋งค ์์คํ ์ฝ๋ ์ค ํ ์ธ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ ์ฝ๋์ด๋ค.
public class ReservationAgency {
public Reservation reserve(Screening screening, Customer customer, int audienceCount) {
Movie movie = screening.getMovie();
boolean discountable = false;
// DiscountCondition์ ๋ํด ๋ฃจํ๋ฅผ ๋๋ฉด์ ํ ์ธ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ์ธ
for (DiscountCondition condition : movie.getDiscountConditions()) {
if (condition.getType() == DiscountConditionType.PERIOD) {
// ๊ธฐ๊ฐ ์กฐ๊ฑด
} else {
discountable = condition.getSequence() == screening.getSequence();
}
if (discountable) {
break;
}
}
// ...
}
}
- ์ด ์ฝ๋์์ ๊ฐ์ฅ ํฐ ๋จ์ ์
ReservationAgency
์ ์ธ์๋ก ์ ๋ฌ๋Screening
์ฌ์ด์ ๊ฒฐํฉ๋๊ฐ ๋๋ฌด ๋๊ธฐ ๋๋ฌธ์Screening
๋ด๋ถ ๊ตฌํ์ ๋ณ๊ฒฝํ ๋ ๋ง๋คReservationAgency
๋ ํจ๊ป ๋ณ๊ฒฝ๋๋ค๋ ๊ฒ์ด๋ค. - ์ด์ฒ๋ผ ํ๋ ฅํ๋ ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌ์กฐ์ ๋ํ ๊ฒฐํฉ์ผ๋ก ์ธํด ๋ฐ์ํ๋ ์ค๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ์๋ ์์น์ด ๋๋ฏธํฐ ๋ฒ์น(Law of Demeter)์ด๋ค.
- ๋๋ฏธํฐ ๋ฒ์น์ ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌ์กฐ์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋์ง ์๋๋ก ํ๋ ฅ ๊ฒฝ๋ก๋ฅผ ์ ์ํ๋ผ๋ ๊ฒ์ด๋ค. (๋ฏ์ ์์๊ฒ ๋งํ์ง ๋ง๋ผ, ์ค์ง ์ธ์ ํ ์ด์ํ๊ณ ๋ง ๋งํ๋ผ)
- ๋๋ฏธํฐ ๋ฒ์น์ ๋ฐ๋ฅด๊ธฐ ์ํด์๋ ํด๋์ค๊ฐ ํน์ ํ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋์์๊ฒ๋ง ๋ฉ์์ง๋ฅผ ์ ์กํ๋๋ก ํ๋ก๊ทธ๋๋ฐํด์ผ ํ๋ค.
- ๋ชจ๋ ํด๋์ค C์ C์ ๊ตฌํ๋ ๋ชจ๋ ๋ฉ์๋ M์ ๋ํด์, M์ด ๋ฉ์์ง๋ฅผ ์ ์กํ ์ ์๋ ๋ชจ๋ ๊ฐ์ฒด๋ ๋ค์์ ์์ ๋ ํด๋์ค์ ์ธ์คํด์ค์ฌ์ผ ํ๋ค. ์ด๋ M์ ์ํด ์์ฑ๋ ๊ฐ์ฒด๋ M์ด ํธ์ถํ๋ ๋ฉ์๋์ ์ํด ์์ฑ๋ ๊ฐ์ฒด, ์ ์ญ ๋ณ์๋ก ์ ์ธ๋ ๊ฐ์ฒด๋ ๋ชจ๋ M์ ์ธ์๋ก ๊ฐ์ฃผํ๋ค.
- ๋ค์์ 4์ฅ์์ ๊ฒฐํฉ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒจ๋ผ๊ธฐ ์ํด ์์ ํ
ReservationAgency
์ ์ต์ข ์ฝ๋์ด๋ค.
public class ReservationAgency {
public Reservation reserve(Screening screening, Customer customer, int audienceCount) {
Money fee = screening.calculateFee(audienceCount);
return new Reservation(customer, screening, fee, audienceCount);
}
}
- ์ด ์ฝ๋์์
ReservationAgency
๋ ๋ฉ์๋์ ์ธ์๋ก ์ ๋ฌ๋Screening
์ธ์คํด์ค์๊ฒ๋ง ๋ฉ์์ง๋ฅผ ์ ์กํ๋ค.ReservationAgency
๋Screening
๋ด๋ถ์ ๋ํ ์ด๋ค ์ ๋ณด๋ ์์ง ๋ชปํ๋ค. ๋๋ฌธ์Screening
์ ๋ด๋ถ ๊ตฌํ์ ๋ณ๊ฒฝํด๋ReservationAgency
๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์๋ค. - ๋๋ฏธํฐ์ ๋ฒ์น์ ๋ฐ๋ฅด๋ฉด ๋ถ๋๋ผํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค. ๋ถ๋๋ผํ๋ ์ฝ๋๋ ๋ถํ์ํ ์ด๋ค ๊ฒ๋ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ๋ณด์ฌ์ฃผ์ง ์์ผ๋ฉฐ, ๋ค๋ฅธ ๊ฐ์ฒด์ ๊ตฌํ์ ์์กดํ์ง ์๋ ์ฝ๋๋ฅผ ๋งํ๋ค.
- ๋๋ฏธํฐ ๋ฒ์น์ ๋ฐ๋ฅด๋ ์ฝ๋๋ ๋ฉ์์ง ์์ ์์ ๋ด๋ถ ๊ตฌ์กฐ๊ฐ ์ ์ก์์๊ฒ ๋ ธ์ถ๋์ง ์์ผ๋ฉฐ, ๋ฉ์์ง ์ ์ก์๋ ์์ ์์ ๋ด๋ถ ๊ตฌํ์ ๊ฒฐํฉ๋์ง ์๋๋ค. ๋ฐ๋ผ์ ๋ฎ์ ๊ฒฐํฉ๋๋ฅผ ์ ์งํ ์ ์๋ค.
- ๋ค์์ ๋๋ฏธํฐ ๋ฒ์น์ ์๋ฐํ๋ ์ฝ๋์ด๋ค.
screening.getMovie().getDiscountConditions();
- ๋ฉ์์ง ์ ์ก์๊ฐ ์์ ์์ ๋ด๋ถ ๊ตฌ์กฐ์ ๋ํด ๋ฌผ์ด๋ณด๊ณ ๋ฐํํ๋ ์์์ ๋ํด ์ฐ์์ ์ผ๋ก ๋ฉ์์ง๋ฅผ ์ ์กํ๋ค. ์ด์ ๊ฐ์ ์ฝ๋๋ฅผ ๊ธฐ์ฐจ ์ถฉ๋(train wreck)์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค. ๋ด๋ถ ๊ตฌํ์ด ์ธ๋ถ๋ก ๋ ธ์ถ๋์ด ๋ฉ์์ง ์์ ์์ ์บก์ํ๋ ๋ฌด๋์ง๊ณ , ๋ฉ์์ง ์ ์ก์๊ฐ ๋ฉ์์ง ์์ ์์ ๋ด๋ถ ๊ตฌํ์ ๊ฐํ๊ฒ ๊ฒฐํฉ๋๋ค.
- ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ํ ์ ์๋ค.
screening.calculateFee(audienceCount);
- ๋๋ฏธํฐ ๋ฒ์น์ ๊ฐ์ฒด๊ฐ ์๊ธฐ ์์ ์ ์ฑ ์์ง๋ ์์จ์ ์ธ ์กด์ฌ์ฌ์ผ ํ๋ค๋ ์ฌ์ค์ ๊ฐ์กฐํ๋ค.
- ๋๋ฏธํฐ ๋ฒ์น์ ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ฌป๋ ๋ฉ์์ง๊ฐ ์๋๋ผ ์์ ์์๊ฒ ๋ฌด์ธ๊ฐ๋ฅผ ์ํค๋ ๋ฉ์์ง๊ฐ ๋ ์ข์ ๋ฉ์์ง๋ผ๊ณ ์์ญ์ธ๋ค.
๐ ๋ฌป์ง ๋ง๊ณ ์์ผ๋ผโ
- ๋๋ฏธํฐ ๋ฒ์น์ ํ๋ฅญํ ๋ฉ์์ง๋ ๊ฐ์ฒด์ ์ํ์ ๊ดํด ๋ฌป์ง ๋ง๊ณ ์ํ๋ ๊ฒ์ ์ ์ผ์ผ ํ๋ค๋ ์ฌ์ค์ ๊ฐ์กฐํ๋ค. ๋ฌป์ง ๋ง๊ณ ์์ผ๋ผ๋ ์ด๋ฐ ์คํ์ผ์ ๋ฉ์์ง ์์ฑ์ ์ฅ๋ คํ๋ ์์น์ ๊ฐ๋ฆฌํค๋ ์ฉ์ด๋ค.
- ๋ฉ์์ง ์ ์ก์๋ ๋ฉ์์ง ์์ ์์ ์ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒฐ์ ์ ๋ด๋ฆฐ ํ ๋ฉ์์ง ์์ ์์ ์ํ๋ฅผ ๋ฐ๊ฟ์๋ ์ ๋๋ค.
- ์ด ์์น์ ๋ฐ๋ฅด๋ฉด ๋ฐ์ ํ๊ฒ ์ฐ๊ด๋ ์ ๋ณด์ ํ๋์ ํจ๊ป ๊ฐ์ง๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค ์ ์๋ค. ๋ํ ๊ฐ์ฒด์ ์ ๋ณด๋ฅผ ์ด์ฉํ๋ ํ๋์ ๊ฐ์ฒด์ ์ธ๋ถ๊ฐ ์๋ ๋ด๋ถ์ ์์น์ํค๊ธฐ ๋๋ฌธ์ ์์ฐ์ค๋ฝ๊ฒ ์ ๋ณด์ ํ๋์ ๋์ผํ ํด๋์ค ์์ ๋๊ฒ ๋๋ค.
๐ ์๋๋ฅผ ๋๋ฌ๋ด๋ ์ธํฐํ์ด์คโ
- ๋ค์๊ณผ ๊ฐ์ด ๋ฉ์๋๊ฐ ์์ ์ ์ด๋ป๊ฒ ์ํํ๋์ง๋ฅผ ๋ํ๋ด๋๋ก ์ด๋ฆ์ ์ง๋ ๊ฒ์ ๋ด๋ถ ๊ตฌํ ๋ฐฉ๋ฒ์ ๋๋ฌ๋ด์ ์ข์ง ์๋ ๋ฐฉ๋ฒ์ด๋ค.
public class PeriodCondition {
public boolean isSatisfiedByPeriod(Screening screening) { }
}
public class SequenceCondition {
public boolean isSatisfiedBySequence(Screening screening) { }
}
- ๋ฉ์๋์ ์ด๋ฆ์ ์ง๋ ๋ฐฉ๋ฒ์ ์ด๋ป๊ฒ๊ฐ ์๋๋ผ ๋ฌด์์ ํ๋์ง๋ฅผ ๋๋ฌ๋ด์ผ ํ๋ค. ์ด๋ ๊ฒ ์ด๋ฆ์ ์ง์ผ๋ฉด ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค ์ ์๊ณ ์ ์ฐํ ์ฝ๋๋ฅผ ๋ณ๋๋ค.
- ๋ฌด์์ ํ๋์ง๋ฅผ ๋๋ฌ๋ด๋๋ก ์ด๋ฆ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด์๋ ํด๋ผ์ด์ธํธ์ ๊ด์ ์์ ํ๋ ฅ์ ๋ฐ๋ผ๋ด์ผ ํ๋ค. ํด๋ผ์ด์ธํธ ๊ด์ ์์์ ๋ ๋ฉ์๋๋ ํ ์ธ ์ฌ๋ถ๋ฅผ ํ๋จํ๊ธฐ ์ํ ์์
์ ์ํํ๊ธฐ ๋๋ฌธ์
isSatisfiedBy
๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ ์ ํ๋ค.
public class PeriodCondition {
public boolean isSatisfiedBy(Screening screening) { }
}
public class SequenceCondition {
public boolean isSatisfiedBy(Screening screening) { }
}
- ํด๋ผ์ด์ธํธ์ ์
์ฅ์์ ๋ ๋ฉ์๋๋ ๋์ผํ ๋ฉ์์ง๋ฅผ ์๋ก ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋์ฒด ๊ฐ๋ฅํ๋ค. ๋๋ฌธ์
DiscountCondition
์ด๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๊ณ ์ธํฐํ์ด์ค์isSatisfiedBy
์คํผ๋ ์ด์ ์ ์ ์ํ๋ค.
public interface DiscountCondition {
boolean isSatisfiedBy(Screening screening);
}
- ๋ฉ์์ง๋ฅผ ์ด๋ป๊ฒ ์ํํ๋๋๊ฐ ์๋๋ผ ๋ฌด์์ ํ๋๋์ ์ด์ ์ ๋ง์ถ๋ฉด ํด๋ผ์ด์ธํธ์ ๊ด์ ์์ ๋์ผํ ์์ ์ ์ํํ๋ ๋ฉ์๋๋ค์ ํ๋์ ํ์ ๊ณ์ธต์ผ๋ก ๋ฌถ์ ์ ์๋ ๊ฐ๋ฅ์ฑ์ด ์ปค์ง๋ค. ์ด์ฒ๋ผ ์ด๋ฆ์ ์ง๋ ํจํด์ ์๋๋ฅผ ๋๋ฌ๋ด๋ ์ ํ์(Intention Revealing Selector)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๐ ํจ๊ป ๋ชจ์ผ๊ธฐโ
- ๋๋ฏธํฐ ๋ฒ์น, ๋ฌป์ง ๋ง๊ณ ์์ผ๋ผ ์คํ์ผ, ์๋๋ฅผ ๋๋ฌ๋ด๋ ์ธํฐํ์ด์ค๋ฅผ ์ดํดํ ์ ์๋ ์ข์ ๋ฐฉ๋ฒ ์ค ํ๋๋ ์ด ์์น์ ์๋ฐ ํ๋ ์ฝ๋๋ฅผ ์ดํด๋ณด๋ ๊ฒ์ด๋ค.
- 1์ฅ์ ํฐ์ผ ํ๋งค ๋๋ฉ์ธ์ด ๋ฐ๋ก ๊ทธ๊ฒ์ด๋ค.
๐ถ ๋๋ฏธํฐ ๋ฒ์น์ ์๋ฐํ๋ ํฐ์ผ ํ๋งค ๋๋ฉ์ธโ
public class Theater {
private TicketSeller ticketSeller;
public Theater(TicketSeller ticketSeller) {
this.ticketSeller = ticketSeller;
}
public void enter(Audience audience) {
if (audience.getBag().hasInvitation()) { // ์ด๋์ฅ์ด ์์ผ๋ฉด
Ticket ticket = ticketSeller.getTicketOffice().getTicket();
audience.getBag().setTicket(ticket); // ํ๋งค์์ด ํฐ์ผ์ ์ค๋ค.
} else { // ์ด๋์ฅ์ด ์์ผ๋ฉด
Ticket ticket = ticketSeller.getTicketOffice().getTicket();
audience.getBag().minusAmount(ticket.getFee()); // ๊ด๋๊ฐ์ด ๋์ ์ง๋ถํ๋ค.
ticketSeller.getTicketOffice().plusAmount(ticket.getFee()); // ํ๋งค์์ด ๋์ ๋ฐ๋๋ค.
audience.getBag().setTicket(ticket); // ํฐ์ผ์ ์ค๋ค.
}
}
}
- ์
Theater
๋ ์ธ์๋ก ์ ๋ฌ๋audience
์ ์ธ์คํด์ค ๋ณ์์ธticketSeller
์๊ฒ ๋ฉ์์ง๋ฅผ ์ ์กํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์์ง๋งaudience
์ticketSeller
๋ด๋ถ์ ํฌํจ๋ ๊ฐ์ฒด์๋ ์ง์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ๋๋ฏธํฐ ๋ฒ์น์ ์๋ฐํ๊ณ ์๋ค.
audience.getBag().minusAmount(ticket.getFee());
- ๊ทผ๋ณธ์ ์ผ๋ก ๋๋ฏธํฐ ๋ฒ์น์ ์๋ฐํ๋ ์ค๊ณ๋ ์ธํฐํ์ด์ค์ ๊ตฌํ์ ๋ถ๋ฆฌ ์์น์ ์๋ฐํ๋ค.
- ๊ฐ์ฒด์ ๋ด๋ถ ๊ตฌ์กฐ๋ ๊ตฌํ์ ํด๋นํ๋ค.
Audience
๊ฐBag
์ ํฌํํ๋ค๋ ์ฌ์ค์Audience
์ ๋ด๋ถ ๊ตฌํ์ ์ํ๋ค. - ๋๋ฏธํฐ ๋ฒ์น์ ์๋ฐํ๋ ์ฝ๋๋ฅผ ์์ ํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์
Audience
์TicketSeller
์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ฌป๋ ๋์Audience
์TicketSeller
๊ฐ ์ง์ ์์ ์ ์ฑ ์์ ์ํํ๋๋ก ์ํค๋ ๊ฒ์ด๋ค.
๐ถ ๋ฌป์ง ๋ง๊ณ ์์ผ๋ผโ
- 1์ฅ์ ๊ตฌํ ๋ด์ฉ๊ณผ ๋น์ท. ์ฑ ์ฐธ๊ณ
public class Theater {
public void enter(Audience audience) {
ticketSeller.setTicket(audience);
}
}
public class TicketSeller {
public void setTicket(Audience audience) {
ticketOffice.plusAmount(
audience.setTicket(ticketOffice.getTicket());
)
}
}
public class Audience {
public Long setTicket(Ticket ticket) {
return bag.setTicket(ticket);
}
}
- ๋๋ฏธํฐ ๋ฒ์น๊ณผ ๋ฌป์ง ๋ง๊ณ ์์ผ๋ผ ์คํ์ผ์ ๋ฐ๋ฅด๋ฉด ์์ฐ์ค๋ฝ๊ฒ ์์จ์ ์ธ ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋ ์ ์ฐํ ํ๋ ฅ์ ์ป๊ฒ ๋๋ค.