Skip to content

Commit

Permalink
Merge branch 'feature/#9' into develop
Browse files Browse the repository at this point in the history
[update feature] 트레이드오프 설계 품질
  • Loading branch information
creaton60 committed Jan 16, 2020
2 parents 78cfecb + 7f23db2 commit 18e4119
Show file tree
Hide file tree
Showing 8 changed files with 148 additions and 21 deletions.
13 changes: 13 additions & 0 deletions src/main/java/study/book/object/movie/Customer.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,17 @@
package study.book.object.movie;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter @Setter
@ToString
public class Customer {
private String name;
private String id;

public Customer(String name, String id) {
this.name = name;
this.id = id;
}
}
54 changes: 54 additions & 0 deletions src/main/java/study/book/object/movie/Movie.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,27 @@
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import study.book.object.movie.condition.DiscountCondition;
import study.book.object.movie.condition.DiscountConditionType;
import study.book.object.movie.policy.DiscountPolicy;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.Collections;
import java.util.List;

@Getter @Setter
@ToString
public class Movie {
private String title;
private Duration runningTime;
private Money fee;
private List<DiscountCondition> discountConditions;

private MovieType movieType;
private Money discountAmount;
private double discountPercent;

private DiscountPolicy discountPolicy;

public Movie(String title, Duration runningTime, Money fee, DiscountPolicy discountPolicy) {
Expand All @@ -29,4 +40,47 @@ public Money calculateMovieFee(Screening screening) {
public void changeDiscountPolicy(DiscountPolicy discountPolicy) {
this.discountPolicy = discountPolicy;
}

public List<DiscountCondition> getDiscountConditions() {
return Collections.unmodifiableList(discountConditions);
}

public Money calculateAmountDiscountedFee() {
if(movieType != MovieType.AMOUNT_DISCOUNT) {
throw new IllegalArgumentException();
}

return fee.minus(discountAmount);
}

public Money calculatePercentDiscountFee() {
if(movieType != MovieType.PERCENT_DISCOUNT) {
throw new IllegalArgumentException();
}

return fee.minus(fee.times(discountPercent));
}

public Money calculateNoneDiscountFee() {
if(movieType != MovieType.NONE_DISCOUNT) {
throw new IllegalArgumentException();
}

return fee;
}

public boolean isDiscountable(LocalDateTime whenScreened, int sequence) {
for(DiscountCondition condition : discountConditions) {
if(condition.getType() == DiscountConditionType.PERIOD) {
if(condition.isDiscountable(whenScreened.getDayOfWeek(), whenScreened.toLocalTime())) {
return true;
}
} else {
if(condition.isDiscountable(sequence)) {
return true;
}
}
}
return false;
}
}
7 changes: 7 additions & 0 deletions src/main/java/study/book/object/movie/MovieType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package study.book.object.movie;

public enum MovieType {
AMOUNT_DISCOUNT,
PERCENT_DISCOUNT,
NONE_DISCOUNT
}
3 changes: 3 additions & 0 deletions src/main/java/study/book/object/movie/Reservation.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package study.book.object.movie;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter @Setter
@ToString
public class Reservation {
private Customer customer;
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/study/book/object/movie/ReservationAgency.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package study.book.object.movie;

public class ReservationAgency {

public Reservation reserve(Screening screening, Customer customer, int audienceCount) {
Money fee = screening.calculateFee(audienceCount);

return new Reservation(customer, screening, fee, audienceCount);
}
}
41 changes: 23 additions & 18 deletions src/main/java/study/book/object/movie/Screening.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
package study.book.object.movie;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.time.LocalDateTime;

@Getter @Setter
@ToString
public class Screening {
private Movie movie;
private int sequece;
Expand All @@ -13,23 +19,22 @@ public Screening(Movie movie, int sequence, LocalDateTime whenScreened) {
this.whenScreened = whenScreened;
}

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

public LocalDateTime getStartTime() {
return whenScreened;
}

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

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

private Money calculateFee(int audienceCount) {
return movie.calculateMovieFee(this);
public Money calculateFee(int audienceCount) {
switch (movie.getMovieType()) {
case AMOUNT_DISCOUNT:
if(movie.isDiscountable(whenScreened, sequece)) {
return movie.calculateAmountDiscountedFee().times(audienceCount);
}
break;
case PERCENT_DISCOUNT:
if(movie.isDiscountable(whenScreened, sequece)) {
return movie.calculatePercentDiscountFee().times(audienceCount);
}
break;
case NONE_DISCOUNT:
return movie.calculateNoneDiscountFee().times(audienceCount);
}

return movie.calculateNoneDiscountFee().times(audienceCount);
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,37 @@
package study.book.object.movie.condition;

import study.book.object.movie.Screening;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

public interface DiscountCondition {
import java.time.DayOfWeek;
import java.time.LocalTime;

boolean isSatisfiedBy(Screening screening);
@Getter @Setter
@ToString
public class DiscountCondition {
private DiscountConditionType type;

private int sequence;

private DayOfWeek dayOfWeek;
private LocalTime startTime;
private LocalTime endTime;

public boolean isDiscountable(DayOfWeek dayOfWeek, LocalTime time) {
if(type != DiscountConditionType.PERIOD) {
throw new IllegalArgumentException();
}

return this.dayOfWeek.equals(dayOfWeek) &&
this.startTime.compareTo(time) <= 0 &&
this.endTime.compareTo(time) >=0;
}

public boolean isDiscountable(int sequence) {
if (type != DiscountConditionType.SEQUENCE) {
throw new IllegalArgumentException();
}
return this.sequence == sequence;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package study.book.object.movie.condition;

public enum DiscountConditionType {
SEQUENCE, // 순번 조건
PERIOD //기간 조건
}

0 comments on commit 18e4119

Please sign in to comment.