精巧的状态机实现片段
public enum SniperState { JOINING { @Override public SniperState whenAuctionClosed() { return LOST; } }, BIDDING { @Override public SniperState whenAuctionClosed() { return LOST; } }, WINNING { @Override public SniperState whenAuctionClosed() { return WON; } }, LOST, WON; public SniperState whenAuctionClosed() { throw new Defect("Auction is already closed"); }}Sniper 英语是狙击手的意思,在这个程序的上下文中表示拍卖交易中的自动出价器。它的状态包括刚刚加入拍卖交易过程、正在出价但未占上风、正在出价但暂时领先、已经失败、已经成功拍下。whenAuctionClosed() 是一个事件回调,表示拍卖交易已经关闭时的回调。
因为已经失败和成功拍下这两个状态都是最终状态,所以调用 whenAuctionClosed() 会抛异常。而其它几个状态会重载这个方法,返回交易关闭后对应的状态。
这段代码摘自 <<Growing Object-Oriented Software, Guided by Tests>>。