Skip to content
Permalink
Browse files
Showing how to avoid exposing common package private interface in an …
…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 0dca650b579471a2ee73edd61161f0d31931761e
Showing 6 changed files with 32 additions and 26 deletions.

This file was deleted.

@@ -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,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();

}
@@ -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:
@@ -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,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;

0 comments on commit 0dca650

Please sign in to comment.