이번 시간에는 주문과 할인 도메인을 개발해 보았다.

package hello.core.discount;

import hello.core.member.Member;

public interface DiscountPolicy {

    int discount(Member member, int price);
}

discount/DiscountPolicy 인터페이스를 생성하였다.

멤버타입 객체와 가격정보를 넘기는 discount 메서드 명시!

할인된 금액을 리턴한다.

 

package hello.core.discount;

import hello.core.member.Grade;
import hello.core.member.Member;

public class FixDiscountPolicy implements DiscountPolicy{

    private int discountFixAmount = 1000;

    @Override
    public int discount(Member member, int price) {
        if(member.getGrade() == Grade.VIP){
            return discountFixAmount;
        }
        else {
            return 0;
        }
    }
}

DiscountPolicy를 구현한 구현체 FixDiscountPolicy를 만들었다.

 

1000원을 할인 하기로하였다.

(등급이 VIP일시)

if문에 == 이 들어갈 수 있는 이유는 Grade가 enum이기 때문이다.

회원등급이 VIP라면 1000원을 리턴하고

그렇지 않다면 0을 리턴한다.

 

package hello.core.order;

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;
    }


    public Long getMemberId() {
        return memberId;
    }

    public void setMemberId(Long memberId) {
        this.memberId = memberId;
    }

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    public int getItemPrice() {
        return itemPrice;
    }

    public void setItemPrice(int itemPrice) {
        this.itemPrice = itemPrice;
    }

    public int getDiscountPrice() {
        return discountPrice;
    }

    public void setDiscountPrice(int discountPrice) {
        this.discountPrice = discountPrice;
    }

    @Override
    public String toString() {
        return "Order{" +
                "memberId=" + memberId +
                ", itemName='" + itemName + '\'' +
                ", itemPrice=" + itemPrice +
                ", discountPrice=" + discountPrice +
                '}';
    }
}

order/Order  클래스를 만들었다.

 

멤버아이디, 상품명, 상품가격, 할인가를 가지고 있다.

 

그리고 계산된 결과를 반환하는 calculatePrice메서드를 만들었다.

그리고 toString메서드를 오버라이딩하여 나중에 객체 자체를

출력할때 toString이 호출되도록 만들었다.

 

package hello.core.order;

public interface OrderService {
    Order createOrder(Long memberId, String itemName, int itemPrice);
}

order/OrderService 인터페이스를 만들었다.

 

 createOrder 메서드를 만드는데 멤버아이디, 상품명, 상품가격을 넘기면

최종 결과를 반환하는 메서드이다.

 

package hello.core.order;

import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
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 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);
    }
}

그리고 대망의 핵심 OrderService 인터페이스를 구현한 OrderServiceImpl을 만들었다.

 

멤버저장소에서 회원을 찾아야하고, 할인 정책을 필요로하기에 

객체를 생성한다.

 

createOrder를 구현하기 위해 

member 객체에서 아이디값을 넘겨서 객체를 받아오고

discountPrice 변수에  discountPolicy의 discount함수를 이용하여 멤버객체와, 상품가격을 넘긴다.

 

단일 책임 원칙을 잘 설계한 예제이다.

+ Recent posts