Skip to content

Commit

Permalink
Showing how to avoid exposing common package private interface in an …
Browse files Browse the repository at this point in the history
…API with the help of an internal class Evaluator which encapsulates all the polymorphic calls into various bets.
  • Loading branch information
Jaroslav Tulach committed Apr 16, 2014
1 parent cfc3cf0 commit 0dca650
Show file tree
Hide file tree
Showing 6 changed files with 32 additions and 26 deletions.
6 changes: 0 additions & 6 deletions src/cz/kamosh/betExample/Bet.java

This file was deleted.

40 changes: 28 additions & 12 deletions src/cz/kamosh/betExample/BettingAgency.java
Expand Up @@ -21,22 +21,38 @@ public double getCurrentCashAmount() {
}

public double evaluateBet(double amount, DrawableBetResult expectedResult, DrawableRandomBet checkDrawableBet) {
return innerEvaluateBet(amount, expectedResult, checkDrawableBet);
class EvalDrawableBet extends Evaluate<DrawableRandomBet> {
@Override
protected InnerBetResult betResult(DrawableRandomBet b) {
return b.checkBet().getInnerBetResult();
}
}
return new EvalDrawableBet().innerEvaluateBet(amount, expectedResult, checkDrawableBet);
}

public double evaluateBet(double amount, WinLostBetResult expectedResult, WinLostTimeBasedBet checkWinLooseBet) {
return innerEvaluateBet(amount, expectedResult, checkWinLooseBet);
}

private double innerEvaluateBet(double amount, BetResult betResult, Bet checkBet) {
if(amount < 0) {
throw new IllegalArgumentException("Cannot bet negative money");
class EvalWinLostBet extends Evaluate<WinLostTimeBasedBet> {
@Override
protected InnerBetResult betResult(WinLostTimeBasedBet b) {
return b.checkBet().getInnerBetResult();
}
}
cash += amount;
if (checkBet.checkBet().getInnerBetResult() == betResult.getInnerBetResult()) {
cash -= amount * BETTING_ODD;
return amount * BETTING_ODD; // User won
return new EvalWinLostBet().innerEvaluateBet(amount, expectedResult, checkWinLooseBet);
}

private abstract class Evaluate<BET> {
public double innerEvaluateBet(double amount, BetResult betResult, BET checkBet) {
if(amount < 0) {
throw new IllegalArgumentException("Cannot bet negative money");
}
cash += amount;
if (betResult(checkBet) == betResult.getInnerBetResult()) {
cash -= amount * BETTING_ODD;
return amount * BETTING_ODD; // User won
}
return 0;
}
return 0;

protected abstract InnerBetResult betResult(BET b);
}
}
3 changes: 1 addition & 2 deletions src/cz/kamosh/betExample/DrawableBet.java
Expand Up @@ -3,9 +3,8 @@
/**
* You may introduce a new type of drawable bet by implementing this interface.
*/
public interface DrawableBet extends Bet<DrawableBetResult> {
public interface DrawableBet {

@Override
public DrawableBetResult checkBet();

}
3 changes: 1 addition & 2 deletions src/cz/kamosh/betExample/DrawableRandomBet.java
Expand Up @@ -5,10 +5,9 @@
/**
* This is basic implementation of drawable bet based on random numbers.
*/
public final class DrawableRandomBet implements Bet<DrawableBetResult> {
public final class DrawableRandomBet {
private static Random rnd = new Random(System.currentTimeMillis());

@Override
public DrawableBetResult checkBet() {
switch(rnd.nextInt(3)) {
case 0:
Expand Down
3 changes: 1 addition & 2 deletions src/cz/kamosh/betExample/WinLostBet.java
Expand Up @@ -3,9 +3,8 @@
/**
* You may introduce a new type of win/lost bet by implementing this interface.
*/
public interface WinLostBet extends Bet<WinLostBetResult>{
public interface WinLostBet {

@Override
public WinLostBetResult checkBet();

}
3 changes: 1 addition & 2 deletions src/cz/kamosh/betExample/WinLostTimeBasedBet.java
Expand Up @@ -3,9 +3,8 @@
/**
* This is basic implementation of win/lost bet based on current time.
*/
public final class WinLostTimeBasedBet implements Bet<WinLostBetResult> {
public final class WinLostTimeBasedBet {

@Override
public WinLostBetResult checkBet() {
if(System.currentTimeMillis() % 2 == 0) {
return WinLostBetResult.WIN;
Expand Down

0 comments on commit 0dca650

Please sign in to comment.