Net设计模式之观察者模式(Observer Pattern)(2)

四.观察者实例分析(Example

1、场景

假设有一股票开盘价格 16.50 元,自从上市以来价格是不断下降,而且以 1.00 元的速度下降。
在股票降到 12.00 元时,股民灵动生活买入了股票。
在股票降到 8.05 元时,股民 Jane 买了股票。

2、观察者实例结构

       <?XML:NAMESPACE PREFIX = V />
Stock ,抽象通知者
定义了委托 PriceChangedHandler ,调用了事件参数 StockDet<?XML:NAMESPACE PREFIX = ST2 />ailsArgs
声明了事件 PriceChanged.
股票在下跌的过程中调用方法 OnPriceChanged ,通过此方法触发事件 PriceChanged
AttachEvent 方法用来添加观察者到对象 <?XML:NAMESPACE PREFIX = O />

StockDetailArgs ,事件参数继承于 EventArgs 类,有树形 CurrentPrice 用来专递价格数据
接口IObserver 和具体观察者Observer 类:

Stoc_PriceChanged 方法:当股票在以 1.00 元降价的过程中调用此方法。当价格降到符合购买者价格,而且股票没有被其他人购买的情况时,执行购买行为。
开盘价格: 16.50
收盘价格: 5.50
当价格降到 12.00 时,观察者灵动生活买入此股票
当价格降到 8.05 时,观察者 Jane 买入此股票

 

3、代码

1 Stock 股票类

public class Stock

{

    private double _openPrice;

    private double _closePrice;

    public delegate void PriceChangedHandler(object sender, StockDetailArgs e);

    public event PriceChangedHandler PriceChanged;

 

    public double OpenPrice

    {

        get { return _openPrice; }

        set { _openPrice = value; }

    }

    public double ClosePrice

    {

        get { return _closePrice; }

        set { _closePrice = value; }

    }

 

    public void StartTrading()

    {

        double current;

 

        //Current price decrements by $1.00 as the stock is traded  

        current = OpenPrice;

 

        while (current > ClosePrice)

        {

            //Stock is falling in increments of $1.00  

            current = current - 1.00;

 

            //Call the method to raise the event  

            OnPriceChanged(current);

 

            //Simulate a delay of 2000ms between market price updates  

            System.Threading.Thread.Sleep(2000);

        }

    }

 

    protected void OnPriceChanged(double currentMarketPrice)

    {

        //Any handlers attached to this event?

        if (PriceChanged != null)

        {

            StockDetailArgs args = new StockDetailArgs();

            args.CurrentPrice = currentMarketPrice;

            Console.WriteLine(" 当前股票价格是:" + args.CurrentPrice.ToString());

            Raise the event

            PriceChanged(this, args);

        }

    }

 

    /// <summary>

    /// 添加观察者

    /// </summary>

    /// <param name="observer"> 观察者 </param>

    public void AttachEvent(IObserver observer)

    {

        PriceChanged += new PriceChangedHandler(observer.Stoc_PriceChanged);

    }

}

 

2 、事件参数 StockDetailArgs

public class StockDetailArgs: EventArgs

{

    private double _currentPrice;

 

    public double CurrentPrice

    {

        get { return _currentPrice; }

        set { _currentPrice = value; }

    }

}

 

 

3 、观察者接口 IObserver

public interface IObserver

{

    void Stoc_PriceChanged(object sender, StockDetailArgs e);

}

 

4 、具体观察者 Observer

public class Observer : IObserver

{

    private string _investorName;

    private double _buyPrice;

    private Stock _stoc;

    private bool _hasBoughtStock = false;

 

    public string InvestorName

    {

        get { return _investorName; }

        set { _investorName = value; }

    }

    public double BuyPrice

    {

        get { return _buyPrice; }

        set { _buyPrice = value; }

    }

    public Stock Stoc

    {

        get { return _stoc; }

        set { _stoc = value; }

    }

 

    public Observer(string investorName, double buyPrice)

    {

        this.InvestorName = investorName;

        this.BuyPrice = buyPrice;

    }

 

    public void Stoc_PriceChanged(object sender, StockDetailArgs e)

    {

        if (e.CurrentPrice <= BuyPrice && _hasBoughtStock == false)

        {

            Console.WriteLine(string.Format("{0} 在价格Price ={1}时买进了股票。" ,InvestorName,e.CurrentPrice));

            _hasBoughtStock = true;

        }

    }

}

 

5 、客户端代码

static void <?XML:NAMESPACE PREFIX = ST1 />Main(string[] args)

{

    Stock stock = new Stock();

    stock.OpenPrice = 16.50;

    stock.ClosePrice = 5.50;

 

    Observer james = new Observer(" 灵动生活" , 12.00);

    Observer jane = new Observer("jane",8.05);

    stock.AttachEvent(james);

    stock.AttachEvent(jane);

    stock.StartTrading();

    Console.Read();

}

 

4、程序运行结果

五、总结(Summary

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化的时,会通知所有观察者对象,使他们能够自动更新自己。解决的是“当一个对象的改变需要同时改变其他对象的时候”问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值