diff --git a/src/main/java/millions/model/Exchange.java b/src/main/java/millions/model/Exchange.java index 46ab5ef..57d91fd 100644 --- a/src/main/java/millions/model/Exchange.java +++ b/src/main/java/millions/model/Exchange.java @@ -2,6 +2,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; +import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; import java.util.HashMap; @@ -20,6 +21,7 @@ public class Exchange { private Random random = new Random(); private final TransactionFactory purchaseFactory = new PurchaseFactory(); private final TransactionFactory saleFactory = new SaleFactory(); + private final List listeners = new ArrayList<>(); public Exchange(String name, List stockList) { this.name = name; @@ -47,6 +49,7 @@ public Transaction buy(String symbol, Player player, BigDecimal quantity) { Transaction purchase = purchaseFactory.createTransaction(shareToBuy, weekNumber); purchase.commit(player); + notifyTransactionCompleted(purchase); return purchase; } @@ -59,6 +62,7 @@ public Transaction sell(Share share, Player player) { Transaction sale = saleFactory.createTransaction(share, weekNumber); sale.commit(player); + notifyTransactionCompleted(sale); return sale; } @@ -107,5 +111,26 @@ public void advance() { .setScale(2, RoundingMode.HALF_UP)); // RoundingMode from AI suggestion } + notifyWeekAdvanced(); + } + + public void addListener(ExchangeListener listener) { + listeners.add(listener); + } + + public void removeListener(ExchangeListener listener) { + listeners.remove(listener); + } + + private void notifyWeekAdvanced() { + for (ExchangeListener listener : listeners) { + listener.onWeekAdvanced(weekNumber); + } + } + + private void notifyTransactionCompleted(Transaction transaction) { + for (ExchangeListener listener : listeners) { + listener.onTransactionCompleted(transaction); + } } } diff --git a/src/main/java/millions/model/Player.java b/src/main/java/millions/model/Player.java index 4324bce..09f43d4 100644 --- a/src/main/java/millions/model/Player.java +++ b/src/main/java/millions/model/Player.java @@ -2,6 +2,8 @@ import java.math.BigDecimal; import java.math.RoundingMode; +import java.util.ArrayList; +import java.util.List; public class Player { private String name; @@ -11,6 +13,7 @@ public class Player { private TransactionArchive transactionArchive; // temporary attribute until a better solution is found public int weeksTraded; + private final List listeners = new ArrayList<>(); public Player(String name, BigDecimal startingMoney) { this.name = name; @@ -33,6 +36,7 @@ public void addMoney(BigDecimal amount) { throw new IllegalArgumentException("Amount cannot be null or negative"); } this.money = this.money.add(amount); + notifyMoneyChanged(); } public void withdrawMoney(BigDecimal amount) { @@ -40,6 +44,7 @@ public void withdrawMoney(BigDecimal amount) { throw new IllegalArgumentException("Amount cannot be null or negative"); } this.money = this.money.subtract(amount); + notifyMoneyChanged(); } public String getStatus() { @@ -70,6 +75,18 @@ public Portfolio getPortfolio() { return this.portfolio; } + public void addShareToPortfolio(Share share) { + this.portfolio.addShare(share); + notifyPortfolioChanged(); + notifyStatusChanged(); + } + + public void removeShareFromPortfolio(Share share) { + this.portfolio.removeShare(share); + notifyPortfolioChanged(); + notifyStatusChanged(); + } + public BigDecimal getNetWorth() { return this.money.add(this.portfolio.getNetWorth()); } @@ -77,4 +94,30 @@ public BigDecimal getNetWorth() { public TransactionArchive getTransactionArchive() { return this.transactionArchive; } + + public void addListener(PlayerListener listener) { + listeners.add(listener); + } + + public void removeListener(PlayerListener listener) { + listeners.remove(listener); + } + + private void notifyMoneyChanged() { + for (PlayerListener listener : listeners) { + listener.onMoneyChanged(money); + } + } + + private void notifyPortfolioChanged() { + for (PlayerListener listener : listeners) { + listener.onPortfolioChanged(); + } + } + + private void notifyStatusChanged() { + for (PlayerListener listener : listeners) { + listener.onStatusChanged(getStatus()); + } + } } diff --git a/src/main/java/millions/model/Purchase.java b/src/main/java/millions/model/Purchase.java index 70bf608..59da2c0 100644 --- a/src/main/java/millions/model/Purchase.java +++ b/src/main/java/millions/model/Purchase.java @@ -18,7 +18,8 @@ public void commit(Player player) { throw new IllegalStateException("Not enought money"); } player.withdrawMoney(getCalculator().calculateTotal()); - player.getPortfolio().addShare(getShare()); + // Don't reach directly to the portefolio object + player.addShareToPortfolio(getShare()); player.getTransactionArchive().add(this); setCommitted(true); } diff --git a/src/main/java/millions/model/Sale.java b/src/main/java/millions/model/Sale.java index 79ef8b0..dbd3637 100644 --- a/src/main/java/millions/model/Sale.java +++ b/src/main/java/millions/model/Sale.java @@ -18,7 +18,7 @@ public void commit(Player player) { throw new IllegalStateException("Does not own the share"); } player.addMoney(getCalculator().calculateTotal()); - player.getPortfolio().removeShare(getShare()); + player.removeShareFromPortfolio(getShare()); player.getTransactionArchive().add(this); setCommitted(true); }