Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
b2c814e
Add #16 - 2장 README를 만들어라
OikimiO Jul 8, 2023
f5b4b8d
Add #17 - 현금을 만들어라
OikimiO Jul 8, 2023
2f9e804
Add #18 - 상영을 만들어라
OikimiO Jul 8, 2023
8ae1751
Add #19 - 영화 예매 기능 구현 > 상영에 예매기능을 추가
OikimiO Jul 8, 2023
af9e9dc
Add #20 - 영화 예매 기능 구현 > 예약에 입력정보를 추가
OikimiO Jul 8, 2023
7365827
Add #21 - 할인 요금 계산 기능 구현 > 영화를 만들어라
OikimiO Jul 8, 2023
4840122
Add #22 - 할인 요금 계산 기능 구현 > 공통 할인 정책에 기능을 추가
OikimiO Jul 8, 2023
7742dd0
Add #23 - 할인 조건 인터페이스 구현 > 순번 조건을 만들어라
OikimiO Jul 8, 2023
828b001
Add #24 - 할인 조건 인터페이스 구현 > 기간 조건을 만들어라
OikimiO Jul 8, 2023
68af8be
Add #25 - 공통 할인 정책 세부 구현 > 정률 할인 정책을 만들어라
OikimiO Jul 8, 2023
c86a474
Add #26 - 공통 할인 정책 세부 구현 > 비율 할인 정책을 만들어라
OikimiO Jul 8, 2023
8938ddb
Add #27 - 영화에서 할인 요금이 없는 상영을 예외처리로 추가
OikimiO Jul 8, 2023
d247277
Add #28 - 공통 할인 정책 세부 구현 > 할인 없는 정책을 만들어라
OikimiO Jul 8, 2023
314e7fc
Add #29 - 할인 없는 정책의 개념적 혼란을 제거하라
OikimiO Jul 8, 2023
b0ccc29
Add #30 - 영화에서 실행시점에 할인 정책을 변경할 수 있도록 변경하라
OikimiO Jul 8, 2023
c09779d
Add #31 - 영화 테스트 코드를 작성하라
OikimiO Jul 9, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/main/java/com/study/object/chapter02/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
## 02. 객체 지향 프로그래밍
---
영화 예매 시스템
영화 예매 시스템
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.study.object.chapter02.movie;

public class AmountDiscountPolicy extends DefaultDiscountPolicy{
private Money discountAmount;

public AmountDiscountPolicy(Money discountAmount, DiscountCondition... conditions) {
super(conditions);
this.discountAmount = discountAmount;
}

@Override
public Money getDiscountAmount(Screening screening) {
return discountAmount;
}
}
4 changes: 4 additions & 0 deletions src/main/java/com/study/object/chapter02/movie/Customer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.study.object.chapter02.movie;

public class Customer {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.study.object.chapter02.movie;

import java.util.ArrayList;
import java.util.List;

public abstract class DefaultDiscountPolicy implements DiscountPolicy {
private List<DiscountCondition> conditions = new ArrayList<>();

public DefaultDiscountPolicy(DiscountCondition ...conditions) {
this.conditions = List.of(conditions);
}

@Override
public Money calculateDiscountAmount(Screening screening) {
for(DiscountCondition each: conditions){
if(each.isSatisfiedBy(screening)){
return getDiscountAmount(screening);
}
}

return Money.ZERO;
}

public abstract Money getDiscountAmount(Screening screening);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.study.object.chapter02.movie;

public interface DiscountCondition {

boolean isSatisfiedBy(Screening screening);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.study.object.chapter02.movie;

public interface DiscountPolicy {
Money calculateDiscountAmount(Screening screening);
}
65 changes: 65 additions & 0 deletions src/main/java/com/study/object/chapter02/movie/Money.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.study.object.chapter02.movie;

import lombok.ToString;

import java.math.BigDecimal;
import java.util.Objects;

@ToString
public class Money {
public static final Money ZERO = Money.wons(0);

private BigDecimal amount;

public Money(BigDecimal amount) {
this.amount = amount;
}

public static Money wons(long amount) {
return new Money(BigDecimal.valueOf(amount));
}

public static Money wons(double amount) {
return new Money(BigDecimal.valueOf(amount));
}

public Money plus(Money amount){
return new Money(this.amount.add(amount.amount));
}

public Money minus(Money amount){
return new Money(this.amount.subtract(amount.amount));
}

public Money times(double percent){
return new Money(this.amount.multiply(new BigDecimal(percent)));
}

public boolean isLessThan(Money other){
return this.amount.compareTo(other.amount) < 0;
}

public boolean isGreaterThan(Money other){
return this.amount.compareTo(other.amount) >= 0;
}

@Override
public boolean equals(Object o) {
if (this == o){
return true;
}

if (o == null || getClass() != o.getClass()) {
return false;
}

Money money = (Money) o;

return amount.compareTo(money.amount) == 0;
}

@Override
public int hashCode() {
return Objects.hash(amount);
}
}
29 changes: 29 additions & 0 deletions src/main/java/com/study/object/chapter02/movie/Movie.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.study.object.chapter02.movie;

import java.time.Duration;

public class Movie {
private String title;
private Duration duration;
private Money fee;
private DiscountPolicy discountPolicy;

public Movie(String title, Duration duration, Money fee, DiscountPolicy discountPolicy) {
this.title = title;
this.duration = duration;
this.fee = fee;
this.discountPolicy = discountPolicy;
}

public void changeDiscountPolicy(DiscountPolicy discountPolicy){
this.discountPolicy = discountPolicy;
}

public Money getFee() {
return this.fee;
}

public Money calculateMovieFee(Screening screening){
return fee.minus(this.discountPolicy.calculateDiscountAmount(screening));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.study.object.chapter02.movie;

public class NonDiscountPolicy implements DiscountPolicy{

@Override
public Money calculateDiscountAmount(Screening screening) {
return Money.ZERO;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.study.object.chapter02.movie;

public class PercentDiscountPolicy extends DefaultDiscountPolicy{
private double percent;

public PercentDiscountPolicy(double percent, DiscountCondition... conditions) {
super(conditions);
this.percent = percent;
}

@Override
public Money getDiscountAmount(Screening screening) {
return screening.getMovieFee().times(percent);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.study.object.chapter02.movie;

import java.time.DayOfWeek;
import java.time.LocalTime;

public class PeriodCondition implements DiscountCondition {
private DayOfWeek dayOfWeek;
private LocalTime startTime;
private LocalTime endTime;

public PeriodCondition(DayOfWeek dayOfWeek, LocalTime startTime, LocalTime endTime) {
this.dayOfWeek = dayOfWeek;
this.startTime = startTime;
this.endTime = endTime;
}

@Override
public boolean isSatisfiedBy(Screening screening) {
return screening.getStartTime().getDayOfWeek().equals(dayOfWeek) &&
screening.getStartTime().toLocalTime().compareTo(startTime) >= 0 &&
screening.getStartTime().toLocalTime().compareTo(endTime) <= 0;
}
}
15 changes: 15 additions & 0 deletions src/main/java/com/study/object/chapter02/movie/Reservation.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.study.object.chapter02.movie;

public class Reservation {
private Customer customer;
private Screening screening;
private Money fee;
private int audienceCount;

public Reservation(Customer customer, Screening screening, Money fee, int audienceCount) {
this.customer = customer;
this.screening = screening;
this.fee = fee;
this.audienceCount = audienceCount;
}
}
36 changes: 36 additions & 0 deletions src/main/java/com/study/object/chapter02/movie/Screening.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.study.object.chapter02.movie;

import java.time.LocalDateTime;

public class Screening {

private Movie movie;
private int sequence;
private LocalDateTime whenScreened;

public Screening(Movie movie, int sequence, LocalDateTime whenScreened) {
this.movie = movie;
this.sequence = sequence;
this.whenScreened = whenScreened;
}

public LocalDateTime getStartTime(){
return this.whenScreened;
}

public boolean isSequence(int sequence){
return this.sequence == sequence;
}

public Money getMovieFee(){
return this.movie.getFee();
}

public Reservation reserve(Customer customer, int audienceCount){
return new Reservation(customer,this, calculateFee(audienceCount), audienceCount);
}

private Money calculateFee(int audienceCount){
return movie.calculateMovieFee(this).times(audienceCount);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.study.object.chapter02.movie;

public class SequenceCondition implements DiscountCondition{

private int sequence;

public SequenceCondition(int sequence) {
this.sequence = sequence;
}

@Override
public boolean isSatisfiedBy(Screening screening){
return screening.isSequence(sequence);
}
}
Loading