Skip to content

Commit aecfb01

Browse files
authored
Merge pull request eugenp#6960 from mikewojtyna/master
Add examples supporting BAEL-2273 article
2 parents a9a55bb + 8a69946 commit aecfb01

16 files changed

+362
-2
lines changed
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.baeldung.ddd.order.doubledispatch;
2+
3+
import org.joda.money.CurrencyUnit;
4+
import org.joda.money.Money;
5+
6+
public class AmountBasedDiscountPolicy implements DiscountPolicy {
7+
@Override
8+
public double discount(Order order) {
9+
if (order.totalCost()
10+
.isGreaterThan(Money.of(CurrencyUnit.USD, 500.00))) {
11+
return 0.10;
12+
} else
13+
return 0;
14+
}
15+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.baeldung.ddd.order.doubledispatch;
2+
3+
public interface DiscountPolicy {
4+
double discount(Order order);
5+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.baeldung.ddd.order.doubledispatch;
2+
3+
public class FlatDiscountPolicy implements DiscountPolicy {
4+
@Override
5+
public double discount(Order order) {
6+
return 0.01;
7+
}
8+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.baeldung.ddd.order.doubledispatch;
2+
3+
import java.math.RoundingMode;
4+
import java.util.List;
5+
6+
import org.joda.money.Money;
7+
8+
import com.baeldung.ddd.order.OrderLine;
9+
import com.baeldung.ddd.order.doubledispatch.visitor.OrderVisitor;
10+
import com.baeldung.ddd.order.doubledispatch.visitor.Visitable;
11+
12+
public class Order extends com.baeldung.ddd.order.Order implements Visitable<OrderVisitor> {
13+
public Order(List<OrderLine> orderLines) {
14+
super(orderLines);
15+
}
16+
17+
public Money totalCost(SpecialDiscountPolicy discountPolicy) {
18+
return totalCost().multipliedBy(1 - applyDiscountPolicy(discountPolicy), RoundingMode.HALF_UP);
19+
}
20+
21+
protected double applyDiscountPolicy(SpecialDiscountPolicy discountPolicy) {
22+
return discountPolicy.discount(this);
23+
}
24+
25+
@Override
26+
public void accept(OrderVisitor visitor) {
27+
visitor.visit(this);
28+
}
29+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.baeldung.ddd.order.doubledispatch;
2+
3+
public interface SpecialDiscountPolicy extends DiscountPolicy {
4+
double discount(SpecialOrder order);
5+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.baeldung.ddd.order.doubledispatch;
2+
3+
import java.util.List;
4+
5+
import com.baeldung.ddd.order.OrderLine;
6+
import com.baeldung.ddd.order.doubledispatch.visitor.OrderVisitor;
7+
8+
public class SpecialOrder extends Order {
9+
10+
private boolean eligibleForExtraDiscount;
11+
12+
public SpecialOrder(List<OrderLine> orderLines) {
13+
super(orderLines);
14+
this.eligibleForExtraDiscount = false;
15+
}
16+
17+
public SpecialOrder(List<OrderLine> orderLines, boolean eligibleForSpecialDiscount) {
18+
super(orderLines);
19+
this.eligibleForExtraDiscount = eligibleForSpecialDiscount;
20+
}
21+
22+
public boolean isEligibleForExtraDiscount() {
23+
return eligibleForExtraDiscount;
24+
}
25+
26+
@Override
27+
protected double applyDiscountPolicy(SpecialDiscountPolicy discountPolicy) {
28+
return discountPolicy.discount(this);
29+
}
30+
31+
@Override
32+
public void accept(OrderVisitor visitor) {
33+
visitor.visit(this);
34+
}
35+
36+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.baeldung.ddd.order.doubledispatch.visitor;
2+
3+
import com.baeldung.ddd.order.doubledispatch.Order;
4+
import com.baeldung.ddd.order.doubledispatch.SpecialOrder;
5+
6+
public class HtmlOrderViewCreator implements OrderVisitor {
7+
8+
private String html;
9+
10+
public String getHtml() {
11+
return html;
12+
}
13+
14+
@Override
15+
public void visit(Order order) {
16+
html = String.format("<p>Regular order total cost: %s</p>", order.totalCost());
17+
}
18+
19+
@Override
20+
public void visit(SpecialOrder order) {
21+
html = String.format("<h1>Special Order</h1><p>total cost: %s</p>", order.totalCost());
22+
}
23+
24+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.baeldung.ddd.order.doubledispatch.visitor;
2+
3+
import com.baeldung.ddd.order.doubledispatch.Order;
4+
import com.baeldung.ddd.order.doubledispatch.SpecialOrder;
5+
6+
public interface OrderVisitor {
7+
void visit(Order order);
8+
void visit(SpecialOrder order);
9+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package com.baeldung.ddd.order.doubledispatch.visitor;
2+
3+
public interface Visitable<V> {
4+
void accept(V visitor);
5+
}

ddd/src/main/java/com/baeldung/ddd/order/jpa/JpaOrder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ BigDecimal getTotalCost() {
9292
}
9393

9494
void removeLineItem(int line) {
95-
JpaOrderLine removedLine = orderLines.remove(line);
95+
orderLines.remove(line);
9696
}
9797

9898
void setCurrencyUnit(String currencyUnit) {

0 commit comments

Comments
 (0)