观察者(Observer)模式:定义了一种一对多的依赖关系。让多个观察者对象同时监听某一个主题对象。

     这个主题对象发生变化时会通知所有观察者对象,使他们字段更新自己

/*
* 抽象主题(Subject)角色:主题角色把所有对观察考对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。
  抽象主题提供一个接口,可以增加和删除观察者对象,主题角色又叫做抽象被观察者(Observable)角色,一般用一个抽象类或者一个接口实现。
* 抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫做更新接口。
  抽象观察者角色一般用一个抽象类或者一个接口实现。在这个示意性的实现中,更新接口只包含一个方法(即Update()方法),这个方法叫做更新方法。
* 具体主题(ConcreteSubject)角色:将有关状态存入具体现察者对象;
  在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者角色(Concrete Observable)。
  具体主题角色通常用一个具体子类实现。
* 具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体现察者角色实现抽象观察者角色所要求的更新接口,
  以便使本身的状态与主题的状态相协调。如果需要,具体现察者角色可以保存一个指向具体主题对象的引用。
  具体观察者角色通常用一个具体子类实现。
*/

  1. Console.WriteLine("\n =========实例2========== \n");
  2. Secretary1 tongzzhe = new Secretary1();
  3.  
  4. StockObserver stock = new StockObserver("张某某", tongzzhe);
  5. NBAObserver nba = new NBAObserver("王某某", tongzzhe);
  6.  
  7. tongzzhe.Attach(stock);
  8.  
  9. tongzzhe.Attach(nba);
  10. tongzzhe.SubjectText = "老板回来了";
  11. tongzzhe.Notify();
  12.  
  13. Console.ReadLine();
  14.  
  15. //抽象通知者 -- 接口
  16. public interface Subject1
  17. {
  18. //增加
  19. void Attach(Observer1 observer1);
  20. void Remove(Observer1 observer1);
  21. void Notify();
  22. string SubjectText
  23. { get; set; }
  24. }
  25.  
  26. //通知者
  27. public class Secretary1 : Subject1
  28. {
  29. //通知列表
  30. private List<Observer1> observers = new List<Observer1>();
  31.  
  32. //增加
  33. public void Attach(Observer1 observer1)
  34. {
  35. observers.Add(observer1);
  36. }
  37. public void Remove(Observer1 observer1)
  38. {
  39. observers.Remove(observer1);
  40. }
  41. //通知
  42. public void Notify()
  43. {
  44. foreach (Observer1 o in observers)
  45. o.Update();
  46. }
  47. public string SubjectText
  48. { get; set; }
  49. }
  50.  
  51. //抽象观察者
  52. public abstract class Observer1
  53. {
  54. protected string name;
  55. protected Subject1 sub;
  56. public Observer1(string name, Subject1 sub)
  57. {
  58. this.name = name;
  59. this.sub = sub;
  60. }
  61. public abstract void Update();
  62. }
  63.  
  64. //看股票同事
  65. public class StockObserver : Observer1
  66. {
  67. public StockObserver(string name, Subject1 sub)
  68. : base(name, sub)
  69. { }
  70. public override void Update()
  71. {
  72. Console.WriteLine("{0},{1} 关闭股票,继续工作。", sub.SubjectText,name);
  73. }
  74. }
  75.  
  76. //看NBA同事
  77. public class NBAObserver : Observer1
  78. {
  79. public NBAObserver(string name, Subject1 sub)
  80. : base(name, sub)
  81. { }
  82. public override void Update()
  83. {
  84. Console.WriteLine("{0},{1} 关闭NBA,继续工作。", sub.SubjectText, name);
  85. }
  86. }

观察者模式的演变。  具体观察者 也就是StockObserver 其实就是为 事件提供方法。

  1. Console.WriteLine("\n =========实例2========== \n");
  2. Secretary1 tongzzhe = new Secretary1();
  3.  
  4. StockObserver stock = new StockObserver("张某某", tongzzhe);
  5. NBAObserver nba = new NBAObserver("王某某", tongzzhe);
  6.  
  7. tongzzhe.Attach(stock.Update);
  8. tongzzhe.Attach(nba.Update);
  9.  
  10. tongzzhe.SubjectText = "老板回来了";
  11. tongzzhe.Notify();
  12.  
  13. //抽象通知者 -- 接口
  14. public interface Subject1
  15. {
  16. void Notify();
  17. string SubjectText
  18. { get; set; }
  19. }
  20.  
  21. public delegate void EventHandler();
  22. //通知者
  23. public class Secretary1 : Subject1
  24. {
  25. // 声明事件;
  26. public event EventHandler eventHandler;
  27. //通知列表
  28. private List<Observer1> observers = new List<Observer1>();
  29.  
  30. //增加
  31. public void Attach(EventHandler observer1)
  32. {
  33. eventHandler += observer1;
  34. }
  35.  
  36. public void Remove(EventHandler observer1)
  37. {
  38. eventHandler -= observer1;
  39. }
  40.  
  41. //通知
  42. public void Notify()
  43. {
  44. if (eventHandler != null)
  45. eventHandler();
  46.  
  47. }
  48. public string SubjectText
  49. { get; set; }
  50. }
  51.  
  52. //抽象观察者
  53. public abstract class Observer1
  54. {
  55. protected string name;
  56. protected Subject1 sub;
  57.  
  58. public Observer1(string name, Subject1 sub)
  59. {
  60. this.name = name;
  61. this.sub = sub;
  62. }
  63.  
  64. public abstract void Update();
  65.  
  66. }
  67.  
  68. //看股票同事
  69. public class StockObserver : Observer1
  70. {
  71. public StockObserver(string name, Subject1 sub)
  72. : base(name, sub)
  73. { }
  74.  
  75. public override void Update()
  76. {
  77. Console.WriteLine("{0},{1} 关闭股票,继续工作。", sub.SubjectText,name);
  78. }
  79. }
  80.  
  81. //看NBA同事
  82. public class NBAObserver : Observer1
  83. {
  84. public NBAObserver(string name, Subject1 sub)
  85. : base(name, sub)
  86. { }
  87.  
  88. public override void Update()
  89. {
  90. Console.WriteLine("{0},{1} 关闭NBA,继续工作。", sub.SubjectText, name);
  91. }
  92. }

观察者(Observer)模式 * 委托事件的更多相关文章

  1. Java 实现观察者(Observer)模式

    1. Java自带的实现 类图 /** * 观察目标 继承自 java.util.Observable * @author stone * */ public class UpdateObservab ...

  2. 设计模式C++描述----04.观察者(Observer)模式

    一. 概述 Observer 模式要解决的问题为:建立一个一(Subject)对多(Observer)的依赖关系,并且做到当“一”变化的时候,依赖这个“一”的多也能够同步改变. Sbuject 相当于 ...

  3. 观察者(Observer)模式

    观察者模式又叫做发布-订阅模式(Publish.Subscribe)模式.模型-视图模式(Model/View)模式.源-监听器模式(Source/Listener)模式或从属者(Dependents ...

  4. Java设计模式之从[星际争霸的兵种升级]分析观察者(Observer)模式

    观察者模式定义对象的一种一对多的依赖关系.当一个对象的状态发生改变时.全部依赖于它的对象都会得到通知并被自己主动更新. 一个简单的样例是.在星际争霸的虫族中有一个0基础单位叫做跳狗(Zergling) ...

  5. 面向对象设计模式——观察者(OBSERVER)模式

    定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.  Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...

  6. 设计模式之观察者(OBSERVER)模式

    定义 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.  Observer模式描述了如何建立这种关系.这一模式中的关键对象是目标(subject ...

  7. java观察者(Observer)模式

    观察者模式:     试想,在电子商务网站上,一个用户看中了一件一份,但是当时衣服的价格太贵,你需要将衣服收藏,以便等衣服降价时自动通知该用户.这里就是典型的观察模式的例子.     1.观察者模式的 ...

  8. Head First 设计模式 —— 02. 观察者 (Observer) 模式

    思考题 在我们的一个实现中,下列哪种说法正确?(多选) P42 public class WeatherDate { // 实例变量声明 public void measurementsChanged ...

  9. 《Head First 设计模式》ch.2 观察者(Observer)模式

    观察者模式 定义了对象之间一对多以来,这样一来,当一个对象改变状态时,它所有的依赖者都会收到通知并自动更新 设计原则-松耦合 松耦合将对象之间的互相依赖降到了最低——只要他们之间的接口仍被遵守 观察者 ...

随机推荐

  1. CAN总线应用

    CAN总线的应用 1.汽车制造中的应用 应用CAN总线,可以减少车身布线,进一步节省了成本,由于采用总线技术,模块之间的信号传递仅需要两条信号线.布线局部化,车上除掉总线外其他所有横贯车身的线都不再需 ...

  2. 让memcached分布式

    memcached是应用最广的开源cache产品,它本身不提供分布式的解决方案,我猜想一方面它想尽量保持产品简单高效,另一方面cache的key-value的特性使得让memcached分布式起来比较 ...

  3. Annotation之三:自定义注解示例,利用反射进行解析

    @Retention定义了该Annotation被保留的时间长短有3中RetentionPolicy.SOURCE源文件有效,RetentionPolicy.CLASS:在class文件中有效,Ret ...

  4. springboot成神之——ioc容器(依赖注入)

    springboot成神之--ioc容器(依赖注入) spring的ioc功能 文件目录结构 lang Chinese English GreetingService MyRepository MyC ...

  5. Windows + Ubuntu 双系统安装

    前言:本篇文章是对之前文章的更新,更新的主内容是把原来用手机拍摄的图片换成了虚拟机的截图,以及对磁盘划分的新的见解和一些使用感受,原本是打算删除之前的那篇Win + Ubuntu双系统的文章的,后来想 ...

  6. python学习——练习题(4)

    """ 题目:输入某年某月某日,判断这一天是这一年的第几天? """ import datetime import time from fu ...

  7. WordPress,discuz 根据不同的入口url更换logo

    Discuz!中调用cookie的思路出来了:    设置cookie:dsetcookie('cookie名', 'cookie值', '有效时间'); 读取cookie有两种方法,第一种使用get ...

  8. ParallaxEffect

    [ParallaxEffect] ParallaxEffect是一种用简单的2D贴图来模拟3D效果的简易方法.譬如一棵树,摄像机俯视时,当树远离摄像机时,树顶偏远,当树靠近,树顶偏近.苹果官方Adve ...

  9. Spring总结四:IOC和DI 注解方式

    首先我们要了解注解和xml配置的区别: 作用一样,但是注解写在Bean的上方来代替我们之前在xml文件中所做的bean配置,也就是说我们使用了注解的方式,就不用再xml里面进行配置了,相对来说注解方式 ...

  10. spring 3.1.13中新增的util @value注解,给类或方法注入值

    在spring 3.0以上版本中,可以通过使用@value,对一些如xxx.properties文件 ,进行键值对的注入,例子如下: 一.类变量注入 1 首先在applicationContext.x ...