大话设计模式之观察者模式--学习笔记
来源:互联网 发布:淘宝在哪修改宝贝 编辑:程序博客网 时间:2024/04/30 04:03
原帖:http://www.cnblogs.com/iuices/archive/2011/05/24/2055461.html
观察者模式就是将一个系统分割成一系列相互协作的类,有一个很不好的副作用,那就是需要维护相关对象间的一致性,但是通过使用委托可以解决这一问题。
实际上,观察者模式所做的工作其实就是在接触耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。
下面来看一个例子:员工(观察者)在公司观察其他事情时不能让老板看到,所以要通过前台秘书(通知者),当秘书看到老板回来时,立即打电话通知员工,告诉他们老板回来了,各就各位继续工作。
interface Subject { void Notify(); string SubjectState { get; set; } }
这是通知者接口,它不依赖于观察者,下面是观察者类
//看股票的同事 class StockObserver { private string name; private Subject sub; public StockObserver(string name, Subject sub) { this.name = name; this.sub = sub; } //关闭股票行情 public void CloseStockMarket() { Console.WriteLine("{0} {1} 关闭股票行情,继续工作!",sub.SubjectState,name); } } //看NBA的同事 class NBAObserver { private string name; private Subject sub; public NBAObserver(string name, Subject sub) { this.name = name; this.sub = sub; } //关闭NBA直播 public void CloseNBADirectSeeding() { Console.WriteLine("{0} {1} 关闭NBA直播,继续工作!", sub.SubjectState, name); } }
下面是通知者类实现(当秘书无法通知时被老板发现了,这时老板也就是通知者了):
//声明一个委托 delegate void EventHandler(); //老板类 class Boss:Subject { //声明一事件Update,类型为委托EventHandler public event EventHandler Update; private string action; public void Notify() { //在访问“通知”方法时,调用“更新” Update(); } public string SubjectState { get { return action; } set { action = value; } } } //秘书类 class Secretary : Subject { //声明一事件Update,类型为委托EventHandler public event EventHandler Update; private string action; public void Notify() { //在访问“通知”方法时,调用“更新” Update(); } public string SubjectState { get { return action; } set { action = value; } } }
客户端代码:
static void Main(string[] args) { Boss syd = new Boss(); StockObserver tongshi1 = new StockObserver("张三", syd); NBAObserver tongshi2 = new NBAObserver("李四", syd); syd.Update += new EventHandler(tongshi1.CloseStockMarket); syd.Update+=new EventHandler(tongshi2.CloseNBADirectSeeding); syd.SubjectState = "我回来了!"; //发出通知 syd.Notify(); Console.ReadLine(); }
委托是一种引用方法类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托的使用可以像其他任何方法一样,具有参数和返回值。委托也可以看作是对函数的抽象,是函数的 ‘类’ ,委托的实例将代表一个具体的函数。
下面是一个委托的示例:
syd.Update += new EventHandler(tongshi1.CloseStockMarket);
委托也是有前提的,那就是委托对象所搭载的所有方法必须有相同的原形和形式,也就是拥有相同的参数列表和返回值类型。
我就是一个小菜,有很多不足的地方请多指点。
- 大话设计模式之观察者模式--学习笔记
- 大话设计模式阅读笔记-观察者模式
- 大话设计模式-观察者模式学习总结
- 大话设计模式之观察者模式
- 【大话设计模式系列】之观察者模式
- 大话设计模式之观察者模式
- 大话设计模式之观察者模式
- 大话设计模式之观察者模式
- 大话设计模式之观察者模式
- 大话设计模式之观察者模式
- 大话设计模式之观察者模式
- 大话设计模式之观察者模式
- 大话设计模式读书笔记之观察者模式
- 学习笔记 ---- 设计模式之观察者模式
- 设计模式之观察者模式学习笔记
- 设计模式学习笔记之观察者模式
- 设计模式学习笔记之观察者模式
- 设计模式学习笔记之观察者模式
- Linux 下的Bluetooth 架构
- 速龙641电脑装机 硬件 参数 BIOS参数调整
- 一个简单socket的例子
- Android自定义画虚线的控件
- ajax异步提交form
- 大话设计模式之观察者模式--学习笔记
- openembedded buildroot
- oracle物化视图讲解
- 浅谈数据仓库建设中的数据建模方法
- 游戏里实现碰撞检测方法
- 【转载】丁林松老师的QT视频及教程源码,讲解比较基础适合新手
- Android 2.3状态栏中添加menu home back快捷键
- android 竖屏显示
- 一年的挨踢工作经验!