using System;
using System.Collections.Generic; namespace ConsoleApplication10
{
/// <summary>
/// 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”
/// ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。
/// 如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,
/// 并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。
/// </summary>
class Program
{
static void Main(string[] args)
{
Stock ms = new Microsoft("Microsoft", 120.00);
ms.AddObserver(new Investor("Jom"));
ms.AddObserver(new Investor("TerryLee"));
ms.Update();
Console.ReadLine();
}
} /// <summary>
/// 股票
/// </summary>
public abstract class Stock
{
private List<IObserver> observers = new List<IObserver>(); private String _symbol; private double _price; public Stock(String symbol, double price)
{
this._symbol = symbol; this._price = price;
} /// <summary>
/// 发送信息
/// </summary>
public void Update()
{
foreach (IObserver ob in observers)
{
ob.SendData(this);
} } public void AddObserver(IObserver observer)
{
observers.Add(observer);
} public void RemoveObserver(IObserver observer)
{
observers.Remove(observer);
} public String Symbol
{
get { return _symbol; }
} public double Price
{
get { return _price; }
}
} /// <summary>
/// 微软的股票
/// </summary>
public class Microsoft : Stock
{
public Microsoft(String symbol, double price)
: base(symbol, price)
{ }
} public interface IObserver
{
void SendData(Stock stock);
} public class Investor : IObserver
{
private string _name; public Investor(string name)
{
this._name = name;
} public void SendData(Stock stock)
{
Console.WriteLine("Notified {0} of {1}'s " + "change to {2:C}", _name, stock.Symbol, stock.Price); } } }
using System;
using System.Collections.Generic; namespace ConsoleApplication10
{
/// <summary>
/// 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系”
/// ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。
/// 如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,
/// 并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。
/// </summary>
class Program
{
static void Main(string[] args)
{
Stock stock = new Stock("Microsoft", 120.00);
Investor investor = new Investor("Jom");
Investor investor1 = new Investor("Sam");
stock.NotifyEvent += new NotifyEventHandler(investor.SendData);
stock.NotifyEvent += new NotifyEventHandler(investor1.SendData);
stock.Update();
Console.ReadLine();
}
} public delegate void NotifyEventHandler(object sender); public class Stock
{
public NotifyEventHandler NotifyEvent; private String _symbol; private double _price; public Stock(String symbol, double price)
{
this._symbol = symbol;
this._price = price;
} public void Update()
{
OnNotifyChange();
} public void OnNotifyChange()
{
if (NotifyEvent != null)
{
NotifyEvent(this);
} } public String Symbol
{
get { return _symbol; }
} public double Price
{
get { return _price; }
}
} public class Investor
{
private string _name; public Investor(string name)
{
this._name = name;
} public void SendData(object obj)
{
if (obj is Stock)
{
Stock stock = (Stock)obj; Console.WriteLine("Notified {0} of {1}'s " + "change to {2:C}", _name, stock.Symbol, stock.Price);
} } }
}

17.观察者模式(Observer Pattern)的更多相关文章

  1. 设计模式 - 观察者模式(Observer Pattern) 详细说明

    观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  2. 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)

    原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...

  3. 设计模式 - 观察者模式(Observer Pattern) 详细解释

    观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

  4. 设计模式-观察者模式(Observer Pattern)

    观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...

  5. jQuery中的观察者模式(Observer Pattern)

    在jQuery中,on方法可以为元素绑定事件,trigger方法可以手动触发事件,围绕这2个方法,我们来体验jQuery中的观察者模式(Observer Pattern). ■ on方法绑定内置事件, ...

  6. 设计模式 - 观察者模式(Observer Pattern) Java内置 用法

    观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...

  7. 二十四种设计模式:观察者模式(Observer Pattern)

    观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...

  8. 使用C# (.NET Core) 实现观察者模式 (Observer Pattern) 并介绍 delegate 和 event

    观察者模式 这里面综合了几本书的资料. 需求 有这么个项目: 需求是这样的: 一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, 它能从气象站获得这三个数据. 还 ...

  9. php观察者模式(observer pattern)

    ... <?php /* The observer pattern implements a one-too-many dependency between objects. The objec ...

随机推荐

  1. 剑指Offer 栈的压入、弹出序列

    题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序 ...

  2. Caffe学习系列(15):添加新层

    如何在Caffe中增加一层新的Layer呢?主要分为四步: (1)在./src/caffe/proto/caffe.proto 中增加对应layer的paramter message: (2)在./i ...

  3. 网页的title左边的小图片怎么添加

    首先,代码中的title标签里是不能加图片的.但是浏览器标提栏前面是可以加一个小图标的. 解决方案:第一步,做一个16 X 16像素的ico格式的图标.具体操作方法是,先在Photoshop中做一个透 ...

  4. mysql中表名是order的CRUD的错误

    org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: com.mysql.jdbc. ...

  5. Starting MySQL.The server quit without updating PID file (xxxx.pid).[FAILED]

    mysql无法正常启动,查看日志报如下异常 --07T01::.929615Z [ERROR] Fatal error: Please read "Security" sectio ...

  6. CEF3开发者系列之类和接口

    CEF3基本的框架包含C/C++程 序接口,通过本地库的接口来实现,而这个库则会隔离宿主程序和 Chromium&Webkit的操作细节.它在浏览器控件和宿主程序之间提供紧密的整合,它支持用户 ...

  7. 5.nodejs权威指南--HTTP

    1. HTTP 1.1 服务器 var http = require('http'); var server = http.createServer(function(req,rsp){ req.on ...

  8. Effective C++ -----条款08: 别让异常逃离析构函数

    析构函数绝对不要吐出异常.如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序. 如果客户需要对某个操作函数运行期间抛出的异常作出反应,那么class应 ...

  9. UIButton修改文字大小问题

    一.问题描述 通过UIButton对象font属性设置文字大小,却发现该属性在2.0.3.0就已经被废弃,ios不建议使用. 图1-1:点出UIButton对象的font属性提示被废弃 图1-2:UI ...

  10. asp.net mvc 部分视图加载区别

    ASP.NET MVC 部分视图   ASP.NET(11)  版权声明:本文为博主原创文章,未经博主允许不得转载. [部分视图] ASP.NET MVC 里的部分视图,相当于 Web Form 里的 ...