의존성이 무엇일까?
금액할인하는 정책을 가진 영화가 있다고하자, 갑자기 영화의 사정이 좋지 않아 할인 정책을 더 추가 해야한다면?
그냥 금액할인 정책 클래스를 인자로 받는 영화를 구현했다면, 변경이 힘들것 이다.
할인정책이라는 인터페이스를 만들고 영화가 할인정책 인터페이스를 인자로 받는다면?
변경이 쉬울 것이다.
예시로, movie 의 생성자이다. DiscountPolicy를 인자로 받는걸 볼 수 있다.
public Movie(String title, Duration runningTime, Money fee, DiscountPolicy discountPolicy) {
this.title = title;
this.runningTime = runningTime;
this.fee = fee;
this.discountPolicy = discountPolicy;
}
인터페이스를 상속받아서 금액할인정책을 구현했다. 이건 영화에 인자로 들어가면 영화는 금액할인정책으로 할인을 계산하게 될 것이다.
public class AmountDiscountPolicy extends DiscountPolicy {
private Money discountAmount;
public AmountDiscountPolicy(Money discountAmount, DiscountCondition... conditions) {
super(conditions);
this.discountAmount = discountAmount;
}
@Override
protected Money getDiscountAmount(Screening screening) {
return discountAmount;
}
}
이를 책에서는 합성이라고하고 이렇게 의존성 관리를 하면 변경에 좋다.
또한, 중복 할인정책을 구현해야한다면?
이런식으로 구현할 수 있다.
이를 영화 클래스의 인자로 넣어주면 영화 클래스는 중복할인 정책으로 계산할 것 이다.
책에서는 new 를 피하라고 했다. 하지만, ArrayList같은 JDK는 변경 가능성이 없으므로 클래스에 인스턴스로 넣어줘도 된다.
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;
}
}
'오브젝트' 카테고리의 다른 글
9. 유연한설계 (0) | 2025.02.04 |
---|---|
6장 메세지와 인터페이스 (0) | 2025.01.14 |
5장 책임을 할당하기 (0) | 2025.01.07 |
4장 설계품질과 트레이드 오프 (0) | 2025.01.03 |
3장 역할, 책임, 협력 (0) | 2024.12.27 |