새로운 할인 정책 적용과 문제점

할인 정책을 변경하려면 클라이언트인 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