할인 정책으로 고정 비율 할인과 고정 비용 할인을 구현하여야 한다. burgerqueen 패키지 내에 discount 패키지를 만들고, 그 안에 discountPoicy 패키지를 만들어두고 나서, 고정 비율 할인 먼저 구현.
1.할인 조건 검사 : 사용자가 할인 조건에 부합하는지 검사하고, 조건 부합 여부를 저장할 수 있어야 한다.
2.할인 정책 결정 : 할인 조건에 따라 적용할 할인 정책을 지정할 수 있어야 한다.
즉,
할인 조건 검사를 위한 메서드가 각 할인 조건마다 필요하며,
할인 조건 검사의 결과(==사용자가 할인 조건에 부합하는지의 여부)를 저장할 수 있어야 하며,
해당 할인 조건에 부합하는 경우, 어떤 할인 정책을 적용시킬 것인지 지정해주어야 하며,
할인을 적용한 가격을 계산해서 사용자에게 보여줄 수 있어야 한다.
위에서 언급한 4가지는 각각 아래의 필드와 메서드로 지정할 수 있다.
할인 조건 검사 → checkDiscountCondition() 메서드
할인 조건 검사 결과 → isSatisfied 필드
적용시킬 할인 정책 → fixedRateDiscountPolicy / fixedAmountDiscountPolicy 필드
할인 적용 → applyDiscount() 메서드
먼저, discount 패키지 내에 discountCondition 패키지를 만들고, 그 안에서 코드스테이츠 수강생 할인 조건(CozDiscountCondition)과 청소년 할인 조건(KidDiscountCondition)을 클래스로 만들어야 한다.
할인을 적용하기 위해서는 먼저 할인 조건에 부합하는지를 검사해야 하며, 부합 여부를 isSatisfied의 값으로 저장해 줄 수 있어야 한다. 요구 사항에서는 아래와 같이 코드스테이츠 수강생인지 물어봄으로써 할인 조건을 검사하고 있다.
위의 빨간 박스 내의 기능을 다시 한번 정리해 보자면
할인 조건에 부합하는지의 여부를 물어보는 문장을 출력해야 한다.
사용자가 입력한 값에 따라 isSatisfied의 값을 적절히 바꿔주어야 한다.
checkDiscountCondition() 메서드를 정의하자
Setter의 접근 제어자가 public일 이유가 없다. 왜냐하면 할인 조건 검사는 철저히 CozDiscountCondition 내부에서 일어나는 동작이기 때문에, 외부에서 Setter를 통해 isSatisfied를 변경할 일이 없도록 해야 하기 때문이다.
객체 내부의 세부 동작을 외부로부터 감추기 위해, 즉 캡슐화를 위해 Setter의 접근 제어자를 private으로 변경
applyDiscount()는 할인 정책을 적용하여 실제 할인 금액을 리턴해주는 메서드이다.
KidDiscountCondition은 앞서 작성한 CozDiscountCondition와 크게 다르지 않다.
할인 기능은 주문하기를 눌렀을 때 적용되어야 한다. 따라서, 할인 조건을 묻고, 할인을 적용해 주는 메서드인 checkDiscountCondition()과 applyDiscount()는 Order에서 호출해주어야 한다.