의존성 : 어떤 객체가 협력하기 위해 다른 객체를 필요로 할 때 두 객체 사이의 의존성이 존재하게 된다. 의존성은 실행 시점과 구현 시점에 서로 다른 의미를 가진다.
- 컴파일타임 의존성 : 코드를 작성하는 시점에서 발생하는 의존성 , 클래스 사이의 의존상
- 런타임 의존성: 애플리케이션이 실행되는 시점의 의존성(객체 사이의 의존성)
- Order에서 FixedAmountVoucher을 의존하도록 변경
- discountAmount를 인자로 받아 fixedAmountVoucher를 사용하도록 생성
- FixedAmountVoucher 클래스를 생성하고 여기에서 할인정책을 어떻게 할건지 결정하도록 바뀌었다.
- OrderTest 에서 보면 10이 어떤 할인 정책을 적용했는지 알 수 없고 Order은 FixedAmoutVouher을 사용하도록 하드코딩 되어있다.
즉 FixedAmountVoucher에 변경이 일어나면 Order에서도 변경을 해줘야 한다.=> 결합도가 강하다
결합도
하나의 객체가 변경이 일어날 때 관계를 맺고 있는 다른 객체에게 변화를 요구하는 정도
![]
- Voucher 인터페이스 생성
- 3 Voucher을 FixedAmountVoucher과 PercentDiscountVoucher가 구현
- Order에서 인터페이스인 Voucher을 의존하도록 변경
할인정책이 PercentVoucher로 바껴도 Order은 수정할 필요가 없어진다.
모든 제어의 흐름은 OrderTest가 가지고있다.