예제 내용 : 회원(저장소)과 주문(할인) 도메인 구현
주문 도메인

주문 클래스 다이어그램

public class OrderServiceImpl implements OrderService {
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
}
**역할(인터페이스)**과 **구현(클래스)**으로 구분하여 단순하고, 유연하며 변경이 용이하게 만들었지만, 위처럼 자바 코드를 작성하면, OCP와 DIP 원칙에 어긋난다.
has a 관계로 강한 결합력이 생긴다.
기능을 확장하려면 클라이언트 코드에 영향을 주기 때문에 OCP를 위반
주문 서비스 클라이언트(OrderServiceImpl)은 DiscountPolicy Interface를 의존하는 동시에 구현 클래스인 RateDiscountPolicy 혹은 FixDiscountPolicy에도 의존하고 있기 때문에 DIP 위반

인터페이스에만 의존하도록 설계를 변경
public class OrderServiceImpl implements OrderService {
private final DiscountPolicy discountPolicy;
}
NullPointerException 발생한다.