17.观察者模式(Observer Pattern)
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)的更多相关文章
- 设计模式 - 观察者模式(Observer Pattern) 详细说明
观察者模式(Observer Pattern) 详细说明 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...
- 设计模式 - 观察者模式(Observer Pattern) 详细解释
观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...
- 设计模式-观察者模式(Observer Pattern)
观察者模式(Observer Pattern):定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使他们能够自动更新自己. 观察者 ...
- jQuery中的观察者模式(Observer Pattern)
在jQuery中,on方法可以为元素绑定事件,trigger方法可以手动触发事件,围绕这2个方法,我们来体验jQuery中的观察者模式(Observer Pattern). ■ on方法绑定内置事件, ...
- 设计模式 - 观察者模式(Observer Pattern) Java内置 用法
观察者模式(Observer Pattern) Java内置 用法 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26601659 ...
- 二十四种设计模式:观察者模式(Observer Pattern)
观察者模式(Observer Pattern) 介绍定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 示例有一个Message实体类,某些对象 ...
- 使用C# (.NET Core) 实现观察者模式 (Observer Pattern) 并介绍 delegate 和 event
观察者模式 这里面综合了几本书的资料. 需求 有这么个项目: 需求是这样的: 一个气象站, 有三个传感器(温度, 湿度, 气压), 有一个WeatherData对象, 它能从气象站获得这三个数据. 还 ...
- php观察者模式(observer pattern)
... <?php /* The observer pattern implements a one-too-many dependency between objects. The objec ...
随机推荐
- Visual Studio error C2001:常量中有换行符(解决办法)
在Visual Studio自动生成的项目中,碰见了一件关于文件编码的问题,集中在类似于以下的语句上: DASLog (DASProtWarn, L"(%s)消息超时,进入慢循环召唤模式.& ...
- JQ库函数记忆要点
1.核心(1.核心函数2.对象访问3.数据缓存4.队列控制4.插件机制5.多库共存) 2.属性(1.属性2.css类3.HTML代码/文本/值) 3.选择器(表单,表单对象属性,基本,内容,子元素,层 ...
- mysql bin-log 使用说明
如何开启bin-log日志? vi /etc/my.cnf [mysqld] log-bin=mysql-bin 默认开启 ls /usr/local/mysql/data/ mysql-bin.00 ...
- BZOJ 4547: Hdu5171 小奇的集合
Sol 首先,考虑这个要怎么搞...让总和最大的方法就是选出当前集合中最大的两个数相加放入集合中就可以了,证明非常简单,当前集合的和为x,它的和只会一直往后增加,所以只需要找到最大的两个数的和加入便是 ...
- CPU时间戳获取
inline long long timt(){ long long p; int&a=*(((int*)&p)+1); __asm__ __volatile__("rdts ...
- sql server2008 获取动态sql的变量值
--通过SQL 字符串 查询 获取查出的值sp_executesql declare @QuerySql nvarchar(500),@uid int,@Ucode varchar(100);set ...
- TorgoiseGit配置ssh密钥
TortoiseGit 使用扩展名为ppk的密钥,而不是ssh-keygen生成的rsa密钥.使用命令ssh-keygen -C "邮箱地址" -t rsa产生的密钥在Tortoi ...
- 一个简单的任务执行时间监视器 StopWatch
有时我们在做开发的时候需要记录每个任务执行时间,或者记录一段代码执行时间,最简单的方法就是打印当前时间与执行完时间的差值,然后这样如果执行大量测试的话就很麻烦,并且不直观, 如果想对执行的时间做进一步 ...
- Oracle 级联删除
alter table ForeignTable(附表)add constraint fk_MainTable_ForeignTable(关联表中的外键) foreign key(ForeignTab ...
- Python之异常追踪模块:traceback
正常时输出追踪信息: import traceback def stack(): print 'The python stack:' traceback.print_stack() from twis ...