๐ Chapter 14: ์ผ๊ด์ฑ ์๋ ํ๋ ฅ
- ์ผ๊ด์ฑ ์๋ ์ค๊ณ๊ฐ ๊ฐ์ ธ๋ค์ฃผ๋ ํฐ ์ด์ต์ ์ฝ๋๊ฐ ์ดํดํ๊ธฐ ์ฌ์์ง๋ค.
- ๊ฐ๋ฅํ๋ค๋ฉด ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ์ ์ฌํ ํ๋ ฅ ํจํด์ ์ฌ์ฉํ๋ผ.
๐ ํธ๋ํฐ ๊ณผ๊ธ ์์คํ ๋ณ๊ฒฝํ๊ธฐโ
- ์์ ์๋ต. ์ฑ P471 ์ฐธ๊ณ
- ์ค๋ช ์๋ต
- ๊ณ ์ ์๊ธ ๋ฐฉ์(
FixedFeePolicy
), ์๊ฐ๋๋ณ ๋ฐฉ์(TimeOfDayDiscountPolicy
), ์์ผ๋ณ ๋ฐฉ์(DayOfWeekDiscountPolicy
), ๊ตฌ๊ฐ๋ณ ๋ฐฉ์(DurationDiscountPolicy
) ๋ค ๊ฐ์ง๋ก ์ถ๊ฐ์ ์ผ๋ก ๋ถ๋ฅ - ๋น์ผ๊ด์ฑ์ ๋ ๊ฐ์ง ์ํฉ์์ ๋ฐ๋ชฉ์ ์ก๋๋ค. ํ๋๋ ์๋ก์ด ๊ตฌํ์ ์ถ๊ฐํด์ผ ํ๋ ์ํฉ์ด๊ณ , ๋ ๋ค๋ฅธ ํ๋๋ ๊ธฐ์กด์ ๊ตฌํ์ ์ดํดํด์ผ ํ๋ ์ํฉ์ด๋ค. ์๋ก์ด ์ ์ฑ ์ ์ถ๊ฐํ๋ฉด ์ถ๊ฐํ ์๋ก ์ฝ๋ ์ฌ์ด์ ์ผ๊ด์ฑ์ ์ ์ ๋ ์ด๊ธ๋๊ฒ ๋๋ ๊ฒ์ด๋ค.
- ์ผ๊ด์ฑ ์๋ ์ฝ๋๊ฐ ๊ฐ์ง๋ ๋ ๋ฒ์งธ ๋ฌธ์ ์ ์ ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ต๋ค๋ ์ ์ด๋ค. ์ ์ฌํ ์๊ตฌ์ฌํญ์ด ์๋ก ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ผ ์๋ค๋ฉด ์๊ตฌ์ฌํญ์ด ์ ์ฌํ๋ค๋ ์ฌ์ค ์์ฒด๋ ์์ฌํ๊ฒ ๋ ๊ฒ์ด๋ค. ๊ทธ ๋๋ฌธ์ ์ ์ฌํ ๊ธฐ๋ฅ์ ์๋ก ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๊ตฌํํด์๋ ์ ๋๋ค.
- ๊ฐ์ฒด์งํฅ์์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๊ฐ์ฒด ์ฌ์ด์ ํ๋ ฅ์ ๋ง๋๋ ๊ฒ๋ฟ์ด๋ฏ๋ก ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์์คํ ์ ๊ตฌ์ถํ๋ ์ฒซ๊ฑธ์์ ํ๋ ฅ์ ์ผ๊ด์ฑ ์๊ฒ ๋ง๋๋ ๊ฒ์ด๋ค.
๐ ์ค๊ณ์ ์ผ๊ด์ฑ ๋ถ์ฌํ๊ธฐโ
- ์ผ๊ด์ฑ ์๋ ์ค๊ณ๋ฅผ ๋ง๋๋ ๊ฐ์ฅ ํ๋ฅญํ ์กฐ์ธ์ ๋ค์ํ ์ค๊ณ ๊ฒฝํ์ ์ตํ๋ผ๋ ๊ฒ์ด๋ค.
- ๋ ๋ฒ์งธ ์กฐ์ธ์ ๋๋ฆฌ ์๋ ค์ง ๋์์ธ ํจํด์ ํ์ตํ๊ณ ๋ณ๊ฒฝ์ด๋ผ๋ ๋ฌธ๋งฅ ์์์ ๋์์ธ ํจํด์ ์ ์ฉํด ๋ณด๋ผ๋ ๊ฒ์ด๋ค.
- ํ๋ ฅ์ ์ผ๊ด์ฑ ์๊ฒ ๋ง๋ค๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๊ธฐ๋ณธ ์ง์นจ์ ๋ฐ๋ฅด๋ ๊ฒ์ด ๋์์ด ๋๋ค.
- ๋ณํ๋ ๊ฐ๋ ์ ๋ณํ์ง ์๋ ๊ฐ๋ ์ผ๋ก๋ถํฐ ๋ถ๋ฆฌํ๋ผ.
- ๋ณํ๋ ๊ฐ๋ ์ ์บก์ํํ๋ผ.
๐ ์กฐ๊ฑด ๋ก์ง ๋ ๊ฐ์ฒด ํ์โ
- ๊ฐ์ฒด์งํฅ์์ ๋ณ๊ฒฝ์ ๋ค๋ฃจ๋ ์ ํต์ ์ธ ๋ฐฉ๋ฒ์ ์กฐ๊ฑด ๋ก์ง์ ๊ฐ์ฒด ์ฌ์ด์ ์ด๋์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ์ด๋ค.
public class Movie {
private DiscountPolicy discountPolicy;
// ํ์ฌ์ ํ ์ธ ์ ์ฑ
์ด ์ด๋ค ์ข
๋ฅ์ธ์ง ํ์ธํ์ง ์๋๋ค.
public Money calculateMovieFee(Screening screening) {
// ๋จ์ํ ํ์ฌ์ ํ ์ธ ์ ์ฑ
์ ๋ํ๋ด๋ discountPolicy์ ํ์ํ ๋ฉ์์ง๋ฅผ ์ ์กํ ๋ฟ์ด๋ค.
// ํ ์ธ ์ ์ฑ
์ ์ข
๋ฅ๋ฅผ ์ฒดํฌํ๋ ์กฐ๊ฑด๋ฌธ์ด discountPolicy๋ก์ ๊ฐ์ฒด ์ด๋์ผ๋ก ๋์ฒด๋ ๊ฒ์ด๋ค.
return fee.minus(discountPolicy.calculateDiscountAmount(screening));
}
}
- ๋คํ์ฑ์ ๋ฐ๋ก ์ด๋ฐ ์กฐ๊ฑด ๋ก์ง์ ๊ฐ์ฒด ์ฌ์ด์ ์ด๋์ผ๋ก ๋ฐ๊พธ๊ธฐ ์ํด ๊ฐ์ฒด์งํฅ์ด ์ ๊ณตํ๋ ์ค๊ณ ๊ธฐ๋ฒ์ด๋ค.
- ๋จ์ํ ์์ ์ ์์ฒญ์ ์ ์ฒ๋ฆฌํด์ค ๊ฒ์ด๋ผ ๋ฏฟ๊ณ ๋ฉ์์ง๋ฅผ ์ ์กํ ๋ฟ์ด๋ค.
- ์ค์ ๋ก ํ๋ ฅ์ ์ฐธ์ฌํ๋ ์ฃผ์ฒด๋ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด๋ค. ์ด ๊ฐ์ฒด๋ค์ ํ๋ ฅ์์์
discountPolicy
๋ฅผ ๋์ฒดํ ์ ์์ด์ผ ํ๋ค. ๋ค์ ๋งํด์discountPolicy
๋ ์๋ธ ํ์ ์ด์ด์ผ ํ๋ค. - ๋ฉ์์ง๋ฅผ ์ ๋ฌํ ๋ฟ ๊ฐ์ฒด์งํฅ์ ์ธ ์ฝ๋๋ ์กฐ๊ฑด์ ํ๋จํ์ง ์๋๋ค. ๋จ์ง ๋ค์ ๊ฐ์ฒด๋ก ์ด๋ํ ๋ฟ์ด๋ค.
- ์กฐ๊ฑด ๋ก์ง์ ๊ฐ์ฒด ์ฌ์ด์ ์ด๋์ผ๋ก ๋์ฒดํ๊ธฐ ์ํด์๋ ์ปค๋ค๋ ํด๋์ค๋ฅผ ๋ ์์ ํด๋์ค๋ค๋ก ๋ถ๋ฆฌํด์ผ ํ๋ค. ํด๋์ค๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ์ํด ๊ฐ์ฅ ์ค์ํ ๊ธฐ์ค์ ๋ณ๊ฒฝ์ ์ด์ ์ ์ฃผ๊ธฐ๋ค. ํด๋์ค๋ ๋ช ํํ ๋จ ํ๋์ ์ด์ ์ ์ํด์๋ง ๋ณ๊ฒฝ๋ผ์ผ ํ๊ณ ํด๋์ค ์์ ๋ชจ๋ ์ฝ๋๋ ํจ๊ป ๋ณ๊ฒฝ๋ผ์ผ ํ๋ค. ์ฆ, ๋จ์ผ ์ฑ ์ ์์น์ ๋ฐ๋ฅด๋๋ก ํด๋์ค๋ฅผ ๋ถ๋ฆฌํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
- ํฐ ๋ฉ์๋ ์์ ๋ญ์ณ์๋ ์กฐ๊ฑด ๋ก์ง๋ค์ ๋ณ๊ฒฝ์ ์๋ ฅ์ ๋ง์ถฐ ์์ ํด๋์ค๋ค๋ก ๋ถ๋ฆฌํ๊ณ ๋๋ฉด ์ธ์คํด์ค๋ค ์ฌ์ด์ ํ๋ ฅ ํจํด์ ์ผ๊ด์ฑ์ ๋ถ์ฌํ๊ธฐ ๋ ์ฌ์์ง๋ค.
- ์ ์ฌํ ํ๋์ ์ํํ๋ ์์ ํด๋์ค๋ค์ด ์์ฐ์ค๋ฝ๊ฒ ์ญํ ์ด๋ผ๋ ์ถ์ํ๋ก ๋ฌถ์ด๊ฒ ๋๊ณ ์ญํ ์ฌ์ด์์ ์ด๋ค์ง๋ ํ๋ ฅ ๋ฐฉ์์ด ์ ์ฒด ์ค๊ณ์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์๊ฒ ์ด๋์ด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
์ผ๊ด์ฑ ์๋ ํ๋ ฅ์ ์ํ ์ง์นจ
- ๋ณํ๋ ๊ฐ๋ ์ ๋ณํ์ง ์๋ ๊ฐ๋ ์ผ๋ก๋ถํฐ ๋ถ๋ฆฌํ๋ผ.
- ๋ณํ๋ ๊ฐ๋ ์ ์บก์ํํ๋ผ.
- ํต์ฌ์ ํ๋ฅญํ ์ถ์ํ๋ฅผ ์ฐพ์ ์ถ์ํ์ ์์กดํ๋๋ก ๋ง๋๋ ๊ฒ์ด๋ค. ์ถ์ํ์ ๋ํ ์์กด์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋์ฒด๊ฐ๋ฅํ ์ญํ ๋ก ๊ตฌ์ฑ๋ ํ๋ ฅ์ ์ค๊ณํ ์ ์๊ฒ ํด์ค๋ค. ๋ฐ๋ผ์ ์ ํํ๋ ์ถ์ํ์ ํ์ง์ด ์บก์ํ์ ํ์ง์ ๊ฒฐ์ ํ๋ค.
- ๋ณ๊ฒฝ์ ์ด์ ์ ๋ง์ถ๊ณ ์บก์ํ์ ๊ด์ ์์ ์ค๊ณ๋ฅผ ๋ฐ๋ผ๋ณด๋ฉด ์ผ๊ด์ฑ ์๋ ํ๋ ฅ ํจํด์ ์ป์ ์ ์๋ค.
๐ ์บก์ํ ๋ค์ ์ดํด๋ณด๊ธฐโ
- ๋ฐ์ดํฐ ์๋์ด๋ ์ค์ง ์ธ๋ถ์ ๊ณต๊ฐ๋ ๋ฉ์๋๋ฅผ ํตํด์๋ง ๊ฐ์ฒด์ ๋ด๋ถ์ ์ ๊ทผํ ์ ์๊ฒ ์ ํํจ์ผ๋ก์จ ๊ฐ์ฒด ๋ด๋ถ์ ์ํ ๊ตฌํ์ ์จ๊ธฐ๋ ๊ธฐ๋ฒ์ ๊ฐ๋ฆฌํจ๋ค. ๊ฐ๋จํ๊ฒ ๋งํด์ ํด๋์ค์ ๋ชจ๋ ์ธ์คํด์ค ๋ณ์๋
private
์ผ๋ก ์ ์ธํด์ผ ํ๊ณ ์ค์ง ํด๋น ํด๋์ค์ ๋ฉ์๋๋ง์ด ์ธ์คํด์ค ๋ณ์์ ์ ๊ทผํ ์ ์์ด์ผ ํ๋ค. - ๊ทธ๋ฌ๋ ์บก์ํ๋ ๋ฐ์ดํฐ ์๋ ์ด์์ด๋ค. GOF์ ์กฐ์ธ์ ๋ฐ๋ฅด๋ฉด ์ํํธ์จ์ด ์์์ ๋ณํ ์ ์๋ ๋ชจ๋ ๊ฐ๋ ์ ๊ฐ์ถ๋ ๊ฒ์ด๋ค. ์บก์ํ๋ ๋ณํ๋ ์ด๋ค ๊ฒ์ด๋ ๊ฐ์ถ๋ ๊ฒ์ด๋ค.
- ์บก์ํ์ ๊ฐ์ฅ ๋ํ์ ์ธ ์๋ ๊ฐ์ฒด์ ํผ๋ธ๋ฆญ ์ธํฐํ์ด์ค์ ๊ตฌํ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค.
- ์ฝ๋ ์์ ์ผ๋ก ์ธํ ํ๊ธํจ๊ณผ๋ฅผ ์ ์ดํ ์ ์๋ ๋ชจ๋ ๊ธฐ๋ฒ์ด ์บก์ํ์ ์ผ์ข ์ด๋ค. ๋ฐ์ดํฐ ์บก์ํ์ ๋ฉ์๋ ์บก์ํ๋ ๊ฐ๋ณ ๊ฐ์ฒด์ ๋ํ ๋ณ๊ฒฝ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ๊ฐ์ฒด ์บก์ํ์ ์๋ธํ์ ์บก์ํ๋ ํ๋ ฅ์ ์ฐธ์ฌํ๋ ๊ฐ์ฒด๋ค์ ๊ด๊ณ์ ๋ํ ๋ณ๊ฒฝ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
- ๋ณ๊ฒฝ์ ์บก์ํํ ์ ์๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์กด์ฌํ์ง๋ง ํ๋ ฅ์ ์ผ๊ด์ฑ ์๊ฒ ๋ง๋ค๊ธฐ ์ํด ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๋ธํ์ ์บก์ํ์ ๊ฐ์ฒด ์บก์ํ๋ฅผ ์กฐํฉํ๋ ๊ฒ์ด๋ค. ์๋ธํ์ ์บก์ํ๋ ์ธํฐํ์ด์ค ์์์ ์ฌ์ฉํ๊ณ , ๊ฐ์ฒด ์บก์ํ๋ ํฉ์ฑ์ ์ฌ์ฉํ๋ค.
- ๋ณํ๋ ๋ถ๋ถ์ ๋ถ๋ฆฌํด์ ํ์ ๊ณ์ธต์ ๋ง๋ ๋ค.
- ๋ณํ๋ ๋ถ๋ถ๋ค์ ๊ณตํต์ ์ธ ํ๋์ ์ถ์ ํด๋์ค๋ ์ธํฐํ์ด์ค๋ก ์ถ์ํํ ํ ๋ณํ๋ ๋ถ๋ถ๋ค์ด ์ด ์ถ์ ํด๋์ค๋ ์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๊ฒ ๋ง๋ ๋ค. ๋ณํ๋ ๋ถ๋ถ์ ๋ณํ์ง ์๋ ๋ถ๋ถ์ ์๋ธํ์ ์ด ๋๋ค.
- ๋ณํ์ง ์๋ ๋ถ๋ถ์ ์ผ๋ถ๋ก ํ์ ๊ณ์ธต์ ํฉ์ฑํ๋ค.
- ํ์ ๊ณ์ธต์ ๋ณํ์ง ์๋ ๋ถ๋ถ์ ํฉ์ฑํ๋ค. ๋ณํ์ง ์๋ ๋ถ๋ถ์์๋ ๋ณ๊ฒฝ๋๋ ๊ตฌ์ฒด์ ์ธ ์ฌํญ์ ๊ฒฐํฉ๋ผ์๋ ์๋๋ค.
- ์์กด์ฑ ์ฃผ์ ๊ณผ ๊ฐ์ด ๊ฒฐํฉ๋๋ฅผ ๋์จํ๊ฒ ์ ์งํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ด์ฉํด ์ค์ง ์ถ์ํ์๋ง ์์กดํ๊ฒ ๋ง๋ ๋ค.
๐ ์ผ๊ด์ฑ ์๋ ๊ธฐ๋ณธ ์ ์ฑ ๊ตฌํํ๊ธฐโ
๐ ๋ณ๊ฒฝ ๋ถ๋ฆฌํ๊ธฐโ
- ์ผ๊ด์ฑ ์๋ ํ๋ ฅ์ ๋ง๋ค๊ธฐ ์ํ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ๋ณํ๋ ๊ฐ๋ ๊ณผ ๋ณํ์ง ์๋ ๊ฐ๋ ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค.
- ์ด ์์ ์์ ์๊ฐ๋๋ณ, ์์ผ๋ณ, ๊ตฌ๊ฐ๋ณ ๋ฐฉ์์ ๊ณตํต์ ์ ๊ฐ ๊ธฐ๋ณธ ์ ์ฑ
์ ๊ตฌ์ฑํ๋ ๋ฐฉ์์ด ์ ์ฌํ๋ค.
- ๊ธฐ๋ณธ ์ ์ฑ ์ ํ ๊ฐ ์ด์์ ๊ท์น์ผ๋ก ๊ตฌ์ฑ๋๋ค.
- ํ๋์ ๊ท์น์ ์ ์ฉ์กฐ๊ฑด๊ณผ ๋จ์์๊ธ์ ์กฐํฉ์ด๋ค.
- ๊ณตํต์ ์ ๋ณํ์ง ์๋ ๋ถ๋ถ์ด๊ณ , ์ฐจ์ด์ ์ ๋ณํ๋ ๋ถ๋ถ์ด๋ค. ๋ฐ๋ผ์ ๋ณํ์ง ์๋ ๊ท์น์ผ๋ก๋ถํฐ ๋ณํ๋ ์ ์ฉ์กฐ๊ฑด์ ๋ถ๋ฆฌํด์ผ ํ๋ค.
๐ ๋ณ๊ฒฝ ์บก์ํํ๊ธฐโ
- ํ๋ ฅ์ ์ผ๊ด์ฑ ์๊ฒ ๋ง๋ค๊ธฐ ์ํด์๋ ๋ณ๊ฒฝ์ ์บก์ํํด์ ํ๊ธํจ๊ณผ๋ฅผ ์ค์ฌ์ผ ํ๋ค.
- ๋ณ๊ฒฝ์ ์บก์ํํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ณํ์ง ์๋ ๋ถ๋ถ์ผ๋ก๋ถํฐ ๋ณํ๋ ๋ถ๋ถ์ ๋ถ๋ฆฌํ๋ ๊ฒ์ด๋ค. ๋ํ ๋ณํ๋ ๋ถ๋ถ์ ๊ณตํต์ ์ ์ถ์ํํ๋ ๊ฒ๋ ํฌํจํ๋ค.
- ์ฌ๊ธฐ์ ๋ณํ์ง ์๋ ๊ฒ์ ๊ท์น์ด๋ค. ๋ณํ๋ ๊ฒ์ ์ ์ฉ์กฐ๊ฑด์ด๋ค. ๋ฐ๋ผ์ ๊ท์น์ผ๋ก๋ถํฐ ์ ์ฉ์กฐ๊ฑด์ ๋ถ๋ฆฌํด์ ์ถ์ํํ ํ ์๊ฐ๋๋ณ, ์์ผ๋ณ, ๊ตฌ๊ฐ๋ณ ๋ฐฉ์์ ์ด ์ถ์ํ์ ์๋ธํ์ ์ผ๋ก ๋ง๋ ๋ค. ์ด๊ฒ์ด ์๋ธํ์ ์ ์บก์ํ๋ค. ๊ทธ ํ์ ๊ท์น์ด ์ ์ฉ์กฐ๊ฑด์ ํํํ๋ ์ถ์ํ๋ฅผ ํฉ์ฑ ๊ด๊ณ๋ก ์ฐ๊ฒฐํ๋ค. ์ด๊ฒ์ด ๊ฐ์ฒด ์บก์ํ๋ค.
๐ ํ๋ ฅ ํจํด ์ค๊ณํ๊ธฐโ
- ๋ณํ๋ ๋ถ๋ถ๊ณผ ๋ณํ์ง ์๋ ๋ถ๋ถ์ ๋ถ๋ฆฌํ๊ณ , ๋ณํ๋ ๋ถ๋ถ์ ์ ์ ํ ์ถ์ํํ๊ณ ๋๋ฉด ๋ณํ๋ ๋ถ๋ถ์ ์๋ตํ ์ฑ ๋ณํ์ง ์๋ ๋ถ๋ถ๋ง์ ์ด์ฉํด ๊ฐ์ฒด ์ฌ์ด์ ํ๋ ฅ์ ์ด์ผ๊ธฐํ ์ ์๋ค.
- ์ถ์ํ๋ง์ผ๋ก ๊ตฌ์ฑํ ํ๋ ฅ์ ์ถ์ํ๋ฅผ ๊ตฌ์ฒด์ ์ธ ์ฌ๋ก๋ก ๋์ฒดํจ์ผ๋ก์จ ๋ค์ํ ์ํฉ์ผ๋ก ํ์ฅํ ์ ์๊ฒ ๋๋ค. ๋ค์ ๋งํด์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ ฅ ํจํด์ด ์ ๋ช ํ๊ฒ ๋๋ฌ๋ ๋ ๊ฒ์ด๋ค.
๐ ์ถ์ํ ์์ค์์ ํ๋ ฅ ํจํด ๊ตฌํํ๊ธฐโ
- ๋จผ์ ์ ์ฉ์กฐ๊ฑด์ ํํํ๋ ์ถ์ํ์ธ
FeeCondition
์์ ์์ํ๋ค.FeeCondition
์findTimeIntervals
๋ผ๋ ๋จ ํ๋์ ์คํผ๋ ์ด์ ์ ํฌํจํ๋ ๊ฐ๋จํ ์ธํฐํ์ด์ค๋ค.
public interface FeeCondition {
// ์ ์ฉ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ธฐ๊ฐ์ ๊ตฌํ ํ List์ ๋ด์ ๋ฐํ
List<DateTimeInterval> findTimeIntervals(Call call);
}
FeeRule
์ ๋จ์์๊ธ(feePerDuration
)๊ณผ ์ ์ฉ์กฐ๊ฑด(feeCondition
)์ ์ ์ฅํ๋ ๋ ๊ฐ์ ์ธ์คํด์ค ๋ณ์๋ก ๊ตฌ์ฑ๋๋ค.
public class FeeRule {
private FeeCondition feeCondition;
private FeePerDuration feePerDuration;
public FeeRule(FeeCondition feeCondition, FeePerDuration, feePerDuration) {
this.feeCondition = feeCondition;
this.feePerDuration = feePerDuration;
}
// FeeCondition์๊ฒ findTimeIntervals ๋ฉ์์ง๋ฅผ ์ ์กํด์ ์กฐ๊ฑด์ ๋ง์กฑํ๋
// ์๊ฐ์ ๋ชฉ๋ก์ ๋ฐํ๋ฐ์ ํ feePerDuration์ ๊ฐ์ ์ด์ฉํด ์๊ธ์ ๊ณ์ฐํ๋ค.
public Money calculateFee(Call call) {
return feeCondition.findTimeIntervals(call)
.stream()
.map(each -> feePerDuration.calculate(each))
.reduce(Money.ZERO, (first, second) -> first.plus(second));
}
}
FeePerDuration
ํด๋์ค๋ ๋จ์ ์๊ฐ๋น ์๊ธ์ด๋ผ๋ ๊ฐ๋ ์ ํํํ๊ณ ์ด ์ ๋ณด๋ฅผ ์ด์ฉํด ์ผ์ ๊ธฐ๊ฐ ๋์์ ์๊ธ์ ๊ณ์ฐํ๋calculate
๋ฉ์๋๋ฅผ ๊ตฌํํ๋ค.
public class FeePerDuration {
private Money fee;
private Duration duration;
public FeePerDuration(Money fee, Duration duration) {
this.fee = fee;
this.duration = duration;
}
public Money calculate(DateTimeInterval interval) {
return fee.times(interval.duration().getSeconds() / duration.getSeconds());
}
}
- ์ด์
BasicRatePolicy
๊ฐFeeRule
์ ์ปฌ๋ ์ ์ ์ด์ฉํด ์ ์ฒด ํตํ ์๊ธ์ ๊ณ์ฐํ๋๋ก ์์ ํ ์ ์๋ค.
public class BasicRatePolicy implements RatePolicy {
private List<FeeRule> feeRules = new ArrayList<>();
public BasicRatePolicy(FeeRule ... feeRules) {
this.feeRules = Arrays.asList(feeRules);
}
@Override
public Money calculateFee(Phone phone) {
return phone.getCalls()
.stream()
.map(call -> calculate(call))
.reduce(Money.ZERO, (first, second) -> first.plus(second));
}
private Money calculate(Call call) {
return feeRules
.stream()
.map(rule -> calculateFee(call))
.reduce(Money.ZERO, (first, second) -> first.plus(second));
}
}
- ์ง๊ธ๊น์ง ๊ตฌํํ ํด๋์ค์ ์ธํฐํ์ด์ค๋ ๋ชจ๋ ๋ณํ์ง ์๋ ์ถ์ํ์ ํด๋นํ๋ค. ์ด ์์๋ค์ ์กฐํฉํ๋ฉด ์ ์ฒด์ ์ธ ํ๋ ฅ ๊ตฌ์กฐ๊ฐ ์์ฑ๋๋ค. ๋ค์ ๋งํด์ ๋ณํ์ง ์๋ ์์์ ์ถ์์ ์ธ ์์๋ง์ผ๋ก๋ ์๊ธ ๊ณ์ฐ์ ํ์ํ ์ ์ฒด์ ์ธ ํ๋ ฅ ๊ตฌ์กฐ๋ฅผ ์ค๋ช ํ ์ ์๋ค๋ ๊ฒ์ด๋ค.
- ๋ณํ๋ ๊ฒ๊ณผ ๋ณํ์ง ์๋ ๊ฒ์ ๋ถ๋ฆฌํ๊ณ ๋ณํ๋ ๊ฒ์ ์บก์ํํ ์ฝ๋๋ ์ค๋ก์ง ๋ณํ์ง ์๋ ๊ฒ๊ณผ ์ถ์ํ์ ๋ํ ์์กด์ฑ๋ง์ผ๋ก๋ ์ ์ฒด์ ์ธ ํ๋ ฅ์ ๊ตฌํํ ์ ์๋ค. ๋ณํ๋ ๊ฒ์ ์ถ์ํ ๋ค์ ์บก์ํ๋์ด ์จ๊ฒจ์ ธ ์๊ธฐ ๋๋ฌธ์ ์ ์ฒด์ ์ธ ํ๋ ฅ์ ๊ตฌ์กฐ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ค.
๐ ๊ตฌ์ฒด์ ์ธ ํ๋ ฅ ๊ตฌํํ๊ธฐโ
FeeCondition
์ธํฐํ์ด์ค๋ฅผ ์ค์ฒดํํ๋ ํด๋์ค์ ๋ฐ๋ผ ๊ธฐ๋ณธ ์ ์ฑ ์ ์ข ๋ฅ๊ฐ ๋ฌ๋ผ์ง๋ค.
๐ถ ์๊ฐ๋๋ณ ์ ์ฑ โ
TimeOfDayFeeCondition
์ ์ธ์คํด์ค๋ ํ๋ ฅ ์์์FeeCondition
์ ๋์ฒดํ ์ ์์ด์ผ ํ๋ค. ๋ฐ๋ผ์FeeCondition
์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ์๋ธํ์ ์ผ๋ก ๋ง๋ค์ด์ผ ํ๋ค.
public class TimeOfDayFeeCondition implements FeeCondition {
private LocalTime from;
private LocalTime to;
public TimeOfDayFeeCondition(LocalTime from, LocalTime to) {
this.from = from;
this.to = to;
}
@Override
public List<DateTimeInterval> findTimeIntervals(Call call) {
return call.getInterval().splitByDay()
.stream()
.map(each ->
DateTimeInterval.of(
LocalDateTime.of(each.getFrom().toLocalDate(), from(each)),
LocalDateTime.of(each.getTo().toLocalDate(), to(each))
)
).collect(Collectors.toList());
}
private LocalTime from(DateTimeInterval interval) {
return interval.getFrom().toLocalTime().isBefore(from) ?
from : interval.getFrom().toLocalTime();
}
private LocalTime to(DateTimeInterval interval) {
return interval.getTo().toLocalTime().isAfter(to) ?
from : interval.getTo().toLocalTime();
}
}
- ๋๋จธ์ง ์ ์ฑ ์๋ต..
- ์ด ์์ ๋ ๋ณ๊ฒฝ์ ์บก์ํํด์ ํ๋ ฅ์ ์ผ๊ด์ฑ ์๊ฒ ๋ง๋ค๋ฉด ์ด๋ค ์ฅ์ ์ ์ป์ ์ ์๋์ง๋ฅผ ์ ๋ณด์ฌ์ค๋ค. ๋ณํ๋ ๋ถ๋ถ์ ๋ณํ์ง ์๋ ๋ถ๋ถ์ผ๋ก๋ถํฐ ๋ถ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ณํ์ง ์๋ ๋ถ๋ถ์ ์ฌ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ธฐ ์ํด ์ค์ง ๋ณํ๋ ๋ถ๋ถ๋ง ๊ตฌํํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์ํ๋ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์์ฑํ ์ ์๋ค. ๋ฐ๋ผ์ ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ด ํฅ์๋๊ณ ํ ์คํธํด์ผ ํ๋ ์ฝ๋์ ์์ด ๊ฐ์ํ๋ค.
- ์ผ๊ด์ฑ ์๋ ํ๋ ฅ์ ๊ฐ๋ฐ์์๊ฒ ํ์ฅ ํฌ์ธํธ๋ฅผ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ ํด์ง ๊ตฌ์กฐ๋ฅผ ์ฐํํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ ๋ค.
- ์ ์ฌํ ๊ธฐ๋ฅ์ ๋ํด ์ ์ฌํ ํ๋ ฅ ํจํด์ ์ ์ฉํ๋ ๊ฒ์ ๊ฐ์ฒด์งํฅ ์์คํ ์์ ๊ฐ๋ ์ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ ์ ์๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
๐ ํ๋ ฅ ํจํด์ ๋ง์ถ๊ธฐโ
- ๊ธฐ์กด ํ๋ ฅ ๋ฐฉ์์ ๋ฒ์ด๋ ๊ท์น์ด ์ถ๊ฐ๋๋๋ผ๋ ๊ฐ๊ธ์ ๊ธฐ์กด์ ํ๋ ฅ ํจํด์ ๋ง์ถ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.
- ๋น๋ก ์ค๊ณ๋ฅผ ์ฝ๊ฐ ๋นํธ๋ ๊ฒ์ด ์กฐ๊ธ์ ์ด์ํ ๊ตฌ์กฐ๋ฅผ ๋ณ๋๋ผ๋ ์ ์ฒด์ ์ผ๋ก ์ผ๊ด์ฑ์ ์ ์งํ ์ ์๋ ์ค๊ณ๋ฅผ ์ ํํ๋ ๊ฒ์ด ํ๋ช ํ๋ค.
์ง์์ ์ผ๋ก ๊ฐ์ ํ๋ผ
- ์ฒ์์๋ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ํ๋ ฅ ํจํด์ด ์๊ฐ์ด ํ๋ฅด๋ฉด์ ์๋ก์ด ์๊ตฌ์ฌํญ์ด ์ถ๊ฐ๋๋ ๊ณผ์ ์์ ์ผ๊ด์ฑ์ ๋ฒฝ์ ์กฐ๊ธ์ฉ ๊ธ์ด ๊ฐ๋ ๊ฒฝ์ฐ๋ฅผ ์์ฃผ ๋ณด๊ฒ ๋๋ค. ์ด ํ์์ ์์ฐ์ค๋ฌ์ด ํ์์ด๋ฉฐ ์คํ๋ ค ์๋ก์ด ์๊ตฌ์ฌํญ์ ์์ฉํ ์ ์๋ ํ๋ ฅ ํจํด์ ํฅํด ์ค๊ณ๋ฅผ ์งํ์ํฌ ์ ์๋ ์ข์ ์ ํธ๋ก ๋ฐ์๋ค์ฌ์ผ ํ๋ค.
- ํ๋ ฅ์ ๊ณ ์ ๋ ๊ฒ์ด ์๋๋ค. ๋ง์ฝ ํ์ฌ์ ํจํด์ด ๋ณ๊ฒฝ์ ๋ฌด๊ฒ๋ฅผ ์งํฑํ๊ธฐ ์ด๋ ต๋ค๋ฉด ๋ณ๊ฒฝ์ ์์ฉํ ์ ์๋ ํ๋ ฅ ํจํด์ ํฅํด ๊ณผ๊ฐํ๊ฒ ๋ฆฌํฉํฐ๋งํ๋ผ.
๐ ํจํด์ ์ฐพ์๋ผโ
- ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ์ฌํ ๊ธฐ๋ฅ์ ๋ํ ๋ณ๊ฒฝ์ด ์ง์์ ์ผ๋ก ๋ฐ์ํ๊ณ ์๋ค๋ฉด ๋ณ๊ฒฝ์ ์บก์ํํ ์ ์๋ ์ ์ ํ ์ถ์ํ๋ฅผ ์ฐพ์ ํ, ์ด ์ถ์ํ์ ๋ณํ์ง ์๋ ๊ณตํต์ ์ธ ์ฑ ์์ ํ ๋นํ๋ผ.
- ํ์ฌ์ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ์ ์บก์ํํ๊ธฐ์ ์ ํฉํ์ง ์๋ค๋ฉด ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ์ํ๋ ๋ณ๊ฒฝ์ ์์ฉํ ์ ์๋๋ก ํ๋ ฅ๊ณผ ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋งํ๋ผ.
- ํ๋ ฅ์ ์ผ๊ด์ฑ ์๊ฒ ๋ง๋๋ ๊ณผ์ ์ ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด ๋ฐ๋ณต์ ์ผ๋ก ์ ์ฉํ ์ ์๋ ํ๋ ฅ์ ๊ตฌ์กฐ๋ฅผ ์ฐพ์๊ฐ๋ ๊ธฐ๋๊ธด ์ฌ์ ์ด๋ค. ๋ฐ๋ผ์ ํ๋ ฅ์ ์ผ๊ด์ฑ ์๊ฒ ๋ง๋ ๋ค๋ ๊ฒ์ ์ ์ฌํ ๋ณ๊ฒฝ์ ์์ฉํ ์ ์๋ ํ๋ ฅ ํจํด์ ๋ฐ๊ฒฌํ๋ ๊ฒ๊ณผ ๋์ผํ๋ค.