public interface DiscountPolicy {
int discount(Member member, int price);
}
public class FixDscountPolicy implements DiscountPolicy {
private int discountFixAmount = 1000;
@Override
public int discount(Member member, int price) {
if(member.getGrade()== Grade.VIP){
return discountFixAmount;
}else {
return 0;
}
}
}
고정, Percent 바뀔지 모르니 인터페이스.
public class Order {
private Long memberId;
private String itemName;
private int itemPrice;
private int discountPrice;
public Order(Long memberId, String itemName, int itemPrice, int discountPrice) {
this.memberId = memberId;
this.itemName = itemName;
this.itemPrice = itemPrice;
this.discountPrice = discountPrice;
}
public int calculatePrice(){
return itemPrice - discountPrice;
}
@Override
public String toString() {
return "Order{" +
"memberId=" + memberId +
", itemName='" + itemName + '\'' +
", itemPrice=" + itemPrice +
", discountPrice=" + discountPrice +
'}';
}
}
주문에 대한 객체, toString 정보 원할하게 보기 위해 오버라이드, calculate는 할인 후 금액 보기 쉽게.
public interface OrderService {
Order createOrder(Long memberId, String itemName, int itemPrice);
}
주문에 대한 객체와 클라이언트의 상호작용을 해주는 서비스
public class OrderServiceImpl implements OrderService{
private MemberRepository memberRepository = new MemoryMemberRepository();
private final DiscountPolicy discountPolicy = new FixDscountPolicy();
@Override
public Order createOrder(Long memberId, String itemName, int itemPrice) {
Member member = memberRepository.findById(memberId);
int discountPrice = discountPolicy.discount(member, itemPrice);
return new Order(memberId, itemName, itemPrice, discountPrice);
}
}
구현. 어쩌다 보니 이게 컨테이너 역할을 하게 됬네.
이거 설계 잘 된거라고 함.
왜냐하면 상호작용을 하는 입장에서 그저 discountPolicy에 가격, member 넘겨주면 알아서 할인된 가격까지 넘겨주기 때문.
즉, 네이밍된 역할에 충실했음.
'스프링 > 1. 스프링 핵심 원리' 카테고리의 다른 글
12강. 퍼센트 할인정책 구현 + 테스트 (0) | 2023.07.16 |
---|---|
11강. 주문할인정책 테스트 (0) | 2023.07.16 |
6강. 회원 도메인 설계 (0) | 2023.07.13 |
5강. 프로젝트 시작 (0) | 2023.07.13 |
3강. 좋은 객체지향의 원칙 5가지, SOLID (0) | 2023.07.12 |