새로운 할인 정책 적용과 문제점
할인 정책을 변경하려면 클라이언트인 OrderServiceImpl 코드를 고쳐야 한다.
public class OrderServiceImpl implements OrderService {
// private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
}
우리는 역할과 구현을 충실하게 분리했다. 다형성도 활용하고, 인터페이스와 구현 객체를 분리했다. 하지만 주문서비스 클라이언트(OrderServiceImpl)는 DiscountPolicy 인터페이스에 의존하면서 구현 클래스에도 의존하고 있다!
OCP는 변경하지 않고 확장할 수 있어야하는데 지금 콛드는 기능을 확장해서 변경하면 클라이언트(OrderServiceImpl) 코드에 영향을 주기 때문에 OCP를 위반한다! OCP(Open-Closed Principle), DIP(Dependency Inversion Principle)을 준수하는 것처럼 보이지만 OCP 위반하고 있는 것이다.
할인정책 변경
이러한 문제 해결 방법은?
인터페이스에 의존하도록 설계를 변경한다!
public class OrderServiceImpl implements OrderService {
//private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
private DiscountPolicy discountPolicy;
}
위의 코드로 변경하고 실행하면 구현체가 없기 때문에 당연히 NPE(Null Pointer Exception)이 발생한다! => 누군가가 클라이언트인 OrderServiceImpl에 DiscountPolicy의 구현체를 대신 생성하고 주입해주면 된다!⭐️
Last updated
Was this helpful?