package auctionsniper; import auctionsniper.UserRequestListener.Item; import auctionsniper.util.Announcer; public class AuctionSniper implements AuctionEventListener { private final Announcer<SniperListener> listeners = Announcer.to(SniperListener.class); private final Auction auction; private SniperSnapshot snapshot; private final Item item; public AuctionSniper(Item item, Auction auction) { this.item = item; this.auction = auction; this.snapshot = SniperSnapshot.joining(item.identifier); } public void addSniperListener(SniperListener listener) { listeners.addListener(listener); } public void auctionClosed() { snapshot = snapshot.closed(); notifyChange(); } public void auctionFailed() { snapshot = snapshot.failed(); notifyChange(); } public void currentPrice(int price, int increment, PriceSource priceSource) { switch(priceSource) { case FromSniper: snapshot = snapshot.winning(price); break; case FromOtherBidder: int bid = price + increment; if (item.allowsBid(bid)) { auction.bid(bid); snapshot = snapshot.bidding(price, bid); } else { snapshot = snapshot.losing(price); } break; } notifyChange(); } public SniperSnapshot getSnapshot() { return snapshot; } private void notifyChange() { listeners.announce().sniperStateChanged(snapshot); } }