14.2 观察者模式

    小D的这种想法涉及了两个角色:一个是观察者,即小D,另一个是被观察的对象,即股票。当股票价格发生一定改变时,股票去通知观察者小D,这样小D就会根据这些变化作出相应的反应。其实,不光像小D这样的散户希望收到通知,还有一些大型机构投资者也希望收到通知,这些机构也是观察者。

    14.2.1 如何实现

    为了发送通知,主题应该知道观察者是谁,所以应该提供注册和删除观察者的接口方法的功能;当发生变化时或者变化到一定程度时,就通知这些观察者。我们首先给出UML实现类图,如图14-1所示。

    figure_0209_0216

    图14-1

    Stock类可以通过addBuyers(StockBuyerbuyer)和removeBuyers(StockBuyer buyer)来注册和移除观察者:股票投资者或投资机构;方法setPrice(float newPrice)设置股票的价格,当股票价格的波动超过一定范围(maxGainAndLoss)时,便会触发notifyBuyers()方法通知所有股票投资者。

    观察者接口StockBuyer有一个update(float price)方法,其实现类定制股票价格发生变化时各自具体的行为,接口代码如下。

    figure_0209_0217

    接下来,我们来看看Stock类的代码实现,大致如下所示。

    figure_0209_0218

    figure_0210_0219

    当股票价格变化超过一定范围时,notifyBuyers()方法调用每一个观察者的update(float price)方法。

    InstitutionalInvestor(机构投资者)实现了StockBuyer接口,当股价高于maxPrice时,机构投资者会卖出100000股,当股价低于minPrice时,会买进20000股。模拟代码大致如下。

    figure_0211_0221

    figure_0212_0222

    同样,PrivateInvestor(散户)也实现StockBuyer接口,当股价高于maxPrice时,散户将会买进500股,当股价低于minPrice时,会卖出1000股。模拟代码大致如下。

    figure_0212_0223

    figure_0213_0224

    我们来编写测试代码,如下所示。

    figure_0213_0225

    figure_0214_0226

    机构投资者Company E的maxPrice是20f、minPrice是18.5f;散户小D的maxPrice是20f、minPrice是18.9f。

    最后,我们看看执行结果如何,如下所示。

    figure_0214_0227