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

简介:

四.观察者实例分析(Example

1、场景

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

2、观察者实例结构

       
Stock ,抽象通知者
定义了委托 PriceChangedHandler  ,调用了事件参数 StockDet ailsA rgs 
声明了事件 PriceChanged.
股票在下跌的过程中调用方法 OnPriceChanged  ,通过此方法触发事件 PriceChanged 
AttachEvent  方法用来添加观察者到对象
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, StockDetailArgse);
    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 fa ll ing in increments of $1.00  
            current = current - 1.00;
 
            //Ca ll  the method to raise the event  
            OnPriceChanged(current);
 
            //Simulate a delay of  2000 ms between  mark et price updates  
            System.Threading.Thread.Sleep( 2000 );
        }
    }
 
    protected void OnPriceChanged(double current Mark etPrice)
    {
        //Any handlers attached to this event?
        if (PriceChanged != nu ll )
        {
            StockDetailArgs args = new StockDetailArgs();
            args.CurrentPrice = current Mark etPrice;
            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 StockDetailArgsEventArgs
{
    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  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

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









本文转自 灵动生活 51CTO博客,原文链接:http://blog.51cto.com/smartlife/258931,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
设计模式 监控 Java
Kotlin - 改良设计模式 - 观察者模式
Kotlin - 改良设计模式 - 观察者模式
52 3
|
1月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
|
2月前
|
设计模式 传感器
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
49 0
|
22天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
24天前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
36 1
|
1月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
28 3
|
2月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
36 9
|
2月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
36 2
|
2月前
|
设计模式 监控 UED
设计模式之观察者模式
【10月更文挑战第12天】 观察者模式是一种行为型设计模式,定义了一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都会自动更新。主要由主题(被观察者)和观察者组成,实现对象间的松耦合,广泛应用于用户界面、事件驱动系统和数据监控等领域。
|
2月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
本教程详细讲解Kotlin语法,适合深入学习。对于快速掌握Kotlin,推荐“简洁”系列教程。本文特别介绍了观察者模式,包括使用Java API和Kotlin委托属性(如Delegates.observable)实现的方法,旨在帮助开发者更高效地实现和优化观察者模式的应用。
41 3