
할인 정책은 인터페이스를 만들고 구현체를 갈아 끼울 수 있도록 설계

실제로는 주문 데이터를 DB에 저장함




package hello.core.Order;
import hello.core.member.Member;
public class Order {
private Long id;
private String name;
private int price;
private int disPrice; // 할인액
public Order(Long id, String name, int price, int disPrice) {
this.id = id;
this.name = name;
this.price = price;
this.disPrice = disPrice;
}
/*
* 할인 적용된 금액
*/
public int calprice(){
return price - disPrice;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getDisPrice() {
return disPrice;
}
public void setDisPrice(int disPrice) {
this.disPrice = disPrice;
}
@Override
public String toString() {
return "Order{" +
"id=" + id +
", name='" + name + '\'' +
", price=" + price +
", disPrice=" + disPrice +
'}';
}
}
package hello.core.Order;
import hello.core.member.Member;
public interface OrderService {
Order createOrder(Long id, String name, int price);
}
package hello.core.Order;
import hello.core.Discount.DiscountPolicy;
import hello.core.Discount.FixedDiscountPolicy;
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();
@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);
}
}
package hello.core.Discount;
import hello.core.member.Member;
public interface DiscountPolicy {
/*
* 할인액
* */
int fixedDiscount(Member member, int price);
}
package hello.core.Discount;
import hello.core.member.Grade;
import hello.core.member.Member;
public class FixedDiscountPolicy implements DiscountPolicy{
private int discountFixAmount = 1000; // 1000원 할인
@Override
public int fixedDiscount(Member member, int price) {
if(member.getGrade() == Grade.VIP){
return discountFixAmount;
}else {
return 0;
}
}
}
package hello.core;
import hello.core.Order.Order;
import hello.core.Order.OrderService;
import hello.core.Order.OrderServiceImpl;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
public class OrderApp {
public static void main(String[] args) {
MemberService memberService = new MemberServiceImpl();
OrderService orderService = new OrderServiceImpl();
// 멤버 생성
Long id = 1L;
Member member = new Member(id, "홍길동", Grade.VIP);
memberService.join(member);
// 주문 생성
Order order = orderService.createOrder(1L, "새우깡", 1700);
// 주문 내용 출력
System.out.println(order);
System.out.println(order.calprice());
}
}
Order{id=1, name='새우깡', price=1700, disPrice=1000}
700
Process finished with exit code 0
package hello.core.Order;
import hello.core.member.Grade;
import hello.core.member.Member;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
public class OrderServiceTest {
MemberService memberService = new MemberServiceImpl();
OrderService orderService = new OrderServiceImpl();
@Test
void createOrder(){
Long id = 1L;
Member member = new Member(id, "홍길동", Grade.VIP);
memberService.join(member);
Order order = orderService.createOrder(1L, "새우깡", 1800);
Assertions.assertThat(order.getDisPrice()).isEqualTo(1000);
}
}
