
package hello.core.Discount;
import hello.core.member.Grade;
import hello.core.member.Member;
public class RateDiscountPolicy implements DiscountPolicy{
private int discountRate = 10;
// 할인 금액
@Override
public int fixedDiscount(Member member, int price) {
if(member.getGrade().equals(Grade.VIP)){
return price * discountRate / 100;
}else {
return 0;
}
}
}
package hello.core.Discount;
import hello.core.member.Grade;
import hello.core.member.Member;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
class RateDiscountPolicyTest {
RateDiscountPolicy discountPolicy = new RateDiscountPolicy();
@Test
@DisplayName("VIP일 경우 10% 적용")
void vipO() {
Member member = new Member(1L, "홍길동", Grade.VIP);
int rs= discountPolicy.fixedDiscount(member, 10000);
Assertions.assertThat(rs).isEqualTo(1000);
}
@Test
@DisplayName("VIP가 아닐 경우 10% 적용")
void vipX() {
Member member1 = new Member(2L, "이순신", Grade.Basic);
int rs= discountPolicy.fixedDiscount(member1, 10000);
Assertions.assertThat(rs).isEqualTo(0);
}
}

정률 할인 구현체를 완성하였다. 이제 OrderServiceImpl을 수정 해보자
package hello.core.Order;
import hello.core.Discount.DiscountPolicy;
import hello.core.Discount.FixedDiscountPolicy;
import hello.core.Discount.RateDiscountPolicy;
import hello.core.member.Member;
import hello.core.member.MemberRepository;
import hello.core.member.MemoryMemberRepository;
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository = new MemoryMemberRepository();
// private final DiscountPolicy discountPolicy = new FixedDiscountPolicy();
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
@Override
public Order createOrder(Long id, String name, int price) {
Member member = memberRepository.findById(id);
int discount = discountPolicy.fixedDiscount(member, price);
return new Order(id, name, price, discount);
}
}
private final DiscountPolicy discountPolicy = new FixedDiscountPolicy();
👉 private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
🚫 DIP
: 주문서비스 구현체는 할인정책 인터페이스에 의존하면서 DIP를 지킨 것 처럼 보이나, 위 코드와 같이 구현체에도 함께 의존하고 있다.
🚫 OCP
: 위와 같이 코드를 변경하므로 OCP를 위반한다.






package hello.core.Order;
import hello.core.Discount.DiscountPolicy;
import hello.core.Discount.FixedDiscountPolicy;
import hello.core.Discount.RateDiscountPolicy;
import hello.core.member.Member;
import hello.core.member.MemberRepository;
import hello.core.member.MemoryMemberRepository;
public class OrderServiceImpl implements OrderService{
private final MemberRepository memberRepository = new MemoryMemberRepository();
// private final DiscountPolicy discountPolicy = new FixedDiscountPolicy();
// private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
private DiscountPolicy discountPolicy;
@Override
public Order createOrder(Long id, String name, int price) {
Member member = memberRepository.findById(id);
int discount = discountPolicy.fixedDiscount(member, price);
return new Order(id, name, price, discount);
}
}
private final DiscountPolicy discountPolicy = new RateDiscountPolicy();
👉 private DiscountPolicy discountPolicy;
package hello.core.member;
public class MemberServiceImpl implements MemberService{
private MemberRepository memberRepository;
@Override
public void join(Member member) {
memberRepository.save(member);
}
@Override
public Member findByMember(Long memberId) {
return memberRepository.findById(memberId);
}
}
private final MemberRepository memberRepository = new MemoryMemberRepository();
👉 private MemberRepository memberRepository;