주문 도메인 전체: 역할과 구현을 분리
주문 도메인 클래스 다이어그램
주문 도메인 객체 다이어그램
public class Order {
private Long memberId; // 회원 ID
private String itemName; // 상품명
private int itemPrice; // 상품가격
private int discountPrice; // 할인가격
// 생성자
// 계산
public int calculatePrice() {
return itemPrice - discountPrice;
}
// getter, setter
}
public interface DiscountPolicy {
int discount(Member member, int price); // 할인적용 역할
}
public class FixDiscountPolicy implements DiscountPolicy {
private int discountFixAmount = 1000; // 1000원 할인
@Override
public int discount(Member member, int price) { // 할인적용 구현
if (member.getGrade() == Grade.VIP){ // VIP면 할인
return discountFixAmount;
} else {
return 0;
}
}
public interface OrderService {
Order createOrder(Long memberId, String itemName, int itemPrice); // 주문 생성 역할
}
public class OrderServiceImpl implements OrderService{
// 회원 저장소: 메모리 회원 저장소
private final MemberRepository memberRepository = new MemoryMemberRepository();
// 할인 정책: 정액 할인 정책
private final DiscountPolicy discountPolicy = new FixDiscountPolicy();
@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);
}
}
public class OrderServiceTest {
// 회원 서비스 구현
MemberService memberService = new MemberServiceImpl();
// 주문 서비스 구현
OrderService orderService = new OrderServiceImpl();
@Test
void createOrder() {
Long memberId = 1L;
Member member = new Member(memberId, "memberA", Grade.VIP);
memberService.join(member); // 회원가입
Order order = orderService.createOrder(memberId, "itemA", 10000); // 주문생성
assertThat(order.getDiscountPrice()).isEqualTo(1000);
}
}