点点滴滴


         从点开始绘制自己的程序人生
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Observer

Posted on 2006-10-29 15:24  点点滴滴  阅读(229)  评论(0编辑  收藏  举报
// Observer pattern -- Real World example

using System;
using System.Collections;

namespace DoFactory.GangOfFour.Observer.RealWorld
{
  
  // MainApp test application

  class MainApp
  {
    static void Main()
    {
      // Create investors
      Investor s = new Investor("Sorros");
      Investor b = new Investor("Berkshire");

      // Create IBM stock and attach investors
      IBM ibm = new IBM("IBM", 120.00);
      ibm.Attach(s);
      ibm.Attach(b);

      // Change price, which notifies investors
      ibm.Price = 120.10;
      ibm.Price = 121.00;
      ibm.Price = 120.50;
      ibm.Price = 120.75;

      // Wait for user
      Console.Read();
    }
  }

  // "Subject"

  abstract class Stock
  {
    protected string symbol;
    protected double price;
    private ArrayList investors = new ArrayList();

    // Constructor
    public Stock(string symbol, double price)
    {
      this.symbol = symbol;
      this.price = price;
    }

    public void Attach(Investor investor)
    {
      investors.Add(investor);
    }

    public void Detach(Investor investor)
    {
      investors.Remove(investor);
    }

    public void Notify()
    {
      foreach (Investor investor in investors)
      {
        investor.Update(this);
      }
      Console.WriteLine("");
    }

    // Properties
    public double Price
    {
      get{ return price; }
      set
      {
        price = value;
        Notify();
      }
    }

    public string Symbol
    {
      get{ return symbol; }
      set{ symbol = value; }
    }
  }

  // "ConcreteSubject"

  class IBM : Stock
  {
    // Constructor
    public IBM(string symbol, double price)
      : base(symbol, price)
    {
    }
  }

  // "Observer"

  interface IInvestor
  {
    void Update(Stock stock);
  }

  // "ConcreteObserver"

  class Investor : IInvestor
  {
    private string name;
    private Stock stock;

    // Constructor
    public Investor(string name)
    {
      this.name = name;
    }

    public void Update(Stock stock)
    {
      Console.WriteLine("Notified {0} of {1}'s " +
        "change to {2:C}", name, stock.Symbol, stock.Price);
    }

    // Property
    public Stock Stock
    {
      get{ return stock; }
      set{ stock = value; }
    }
  }
}