网上找了很多关于观察者模式的代码例子和文章,都写的比较复杂,我个人还是喜欢从易到难,今天自己参考网上资料,也写了一个简单观察者模式的例子,简单的复习了一下Observer 模式,Observer 模式使用一对多的方式,可以让多个观察者同时关注同一个事物,并作出不同的响应。
例如下面的例子,Manager的底薪为基本工资的1.6倍,Employee的底薪为基本工资的1.2倍。Observer 类的Attach方法与Detach方法可以用于注册和注销观察者,最后执行Execute方法可以对多个已注册的观察者同时输入参数。

开发 Observer 模式时借助委托,可以进一步简化开发的过程。由于委托对象支持多路广播,在Observer 类中建立了一个委托对象wageHandler,通过Attach与Detach方法可以分别加入或取消委托。如果观察者想对事物进行监测,只需要加入一个委托对象即可。然后委托的GetInvodationList方法能获取多路广播委托列表,在Execute方法中,就是通过去多路广播委托列表去判断所绑定的委托数量是否为0。

  1. public delegate double Handler(double wages);
  2.  
  3. public class Manager
  4. {
  5. public double GetWages(double basicWages)
  6. {
  7. double totalWages = 1.6 * basicWages;
  8. Console.WriteLine("Manager's wages is : " + totalWages);
  9. return totalWages;
  10. }
  11. }
  12.  
  13. public class Employee
  14. {
  15. public double GetWages(double basicWages)
  16. {
  17. double totalWages = 1.2 * basicWages;
  18. Console.WriteLine("Employee's wages is : " + totalWages);
  19. return totalWages;
  20. }
  21. }
  22. public class Observe
  23. {
  24.  
  25. public Handler WageHandler { get; set; }
  26.  
  27. //通过GetInvodationList方法获取多路广播委托列表,如果观察者数量大于0即执行方法
  28. public void Execute(double basicWages)
  29. {
  30. if (WageHandler != null)
  31. if (WageHandler.GetInvocationList().Count() > )
  32. WageHandler(basicWages);
  33. }
  34. }
  35. class Program
  36. {
  37. static void Main(string[] args)
  38. {
  39. Observe wageManager = new Observe();
  40. //加入Manager观察者
  41. wageManager.WageHandler += new Handler(new Manager().GetWages);
  42.  
  43. //加入Employee观察者
  44. wageManager.WageHandler += new Handler(new Employee().GetWages);
  45.  
  46. //同时加入底薪3000元,分别进行计算
  47. wageManager.Execute();
  48. Console.ReadKey();
  49. }
  50. }

执行结果:

然后为了加大难度,又用C++编写了一个类似例子来实现观察者模式,当然C++编写起来相对C#会复杂一些,而且最终实现效果没有C#好,但是一切都是为了更好的学习和理解语言,这波还是不亏的,C++里面有个和委托类似的东西,它的名字叫函数指针,然后用set存放函数指针,遍历执行

  1. #include "stdafx.h"
  2. using namespace std;
  3.  
  4. typedef double(*Handler)(double wages);//定义函数指针,功能和C#中的委托类似
  5.  
  6. class Manager
  7. {
  8. public:
  9. static double GetWages(double basicWages) {
  10. double totalWages = 1.6*basicWages;
  11. cout << "Manager's wages is : " << totalWages << endl;
  12. return totalWages;
  13. }
  14. };
  15. class Employee
  16. {
  17. public:
  18. static double GetWages(double basicWages) {
  19. double totalWages = 1.2*basicWages;
  20. cout << "Employee's wages is : " << totalWages << endl;
  21. return totalWages;
  22. }
  23. };
  24.  
  25. class Observe
  26. {
  27. public:
  28. set<Handler> set;
  29. //加入观察者
  30. void Attach(Handler wageHandler1) {
  31. set.insert(wageHandler1);
  32. }
  33. //删除观察者
  34. void Detach(Handler wageHandler1) {
  35. set.erase(wageHandler1);
  36. }
  37. void Execute(double basicWages) {
  38. if (NULL != &set)
  39. {
  40. if (set.size() > )
  41. {
  42. typename std::set<Handler>::iterator it;//list<T>前面需要用typename限定一下,因为编译器不知道list<T>::iterator是代表一个类型。list<T>::iterator iter; 改为 typename std::list<T>::iterator iter;
  43. for (it = set.begin(); it != set.end(); it++)
  44. {
  45. (*it)(basicWages);
  46. }
  47. }
  48. }
  49. }
  50. };
  51.  
  52. int main()
  53. {
  54. Manager man;
  55. Employee emp;
  56. Observe observe;
  57. //加入Manager观察者
  58. Handler managerHandler = &(man.GetWages);
  59. observe.Attach(managerHandler);
  60. //加入Employee观察者
  61. Handler employeeHandler = &(emp.GetWages);
  62. observe.Attach(employeeHandler);
  63.  
  64. //同时加入底薪3000元,分别进行计算
  65. observe.Execute();
  66.  
  67. system("pause");
  68. return ;
  69. }

哈哈,大功告成,撸这种在老板面前一文不值,自己却撸的很嗨的代码,还真是很开心的呢^^,也许这就是程序猿才能明白的快乐吧

分别用C/C++ 和 C#实现简单的观察者模式的更多相关文章

  1. 一个简单的观察者模式的JS实现

    这不是原创文章,主要是写给自己看的.原文比较详细容易让人,我提取最简单最好理解的部分,便于我以后用到.参考http://www.cnblogs.com/TomXu/archive/2012/03/02 ...

  2. JS实现简单的观察者模式

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. .net 多播委托的使用方法以及场景,更简单的观察者模式

    首先来说一下什么是多播委托 多播委托就是在委托里定义一个或者多个方法的一个集合 使用方法: public Action actList; //添加方法 public void AddActionMet ...

  4. PHP 高级编程(3/5) - 使用SPL(标准PHP库)实现观察者模式

    SPL(标准PHP库 - Standard PHP Library)是PHP5面向对象功能中重要的部分.原文解释是这样的“The Standard PHP Library (SPL) is a col ...

  5. 设计模式--观察者模式初探和java Observable模式

    初步认识观察者模式 观察者模式又称为发布/订阅(Publish/Subscribe)模式,因此我们可以用报纸期刊的订阅来形象的说明: 报社方负责出版报纸. 你订阅了该报社的报纸,那么只要报社发布了新报 ...

  6. Java程序员学习之路

    1. Java语言基础 谈到Java语 言基础学习的书籍,大家肯定会推荐Bruce Eckel的<Thinking in Java>.它是一本写的相当深刻的技术书籍,Java语言基础部分基 ...

  7. Vue 源码解析:深入响应式原理(上)

    原文链接:http://www.imooc.com/article/14466 Vue.js 最显著的功能就是响应式系统,它是一个典型的 MVVM 框架,模型(Model)只是普通的 JavaScri ...

  8. (六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本章我们讨论一个除前面的单例 ...

  9. Orchard源码分析(4.3):Orchard.Events.EventsModule类(Event Bus)

    概述 采用Event Bus模式(事件总线),可以使观察者模式中的观察者和被观察者实现解耦. 在.Net 中使用观察者模式,可以使用事件(委托)和接口(类).Orchard Event  Bus使用的 ...

随机推荐

  1. Android_设置全屏的方法

    在开发的过程中,我们有时候需要让我们应用程序全屏或者是让某个页面全屏,在今天的android小技巧中我们来讲讲如何设置我们的应用程序 全屏: 通常我们有三种方式: 1.在onCreate方法中添加代码 ...

  2. 几句话说说跨IDC分布式数据库Calvin

    CalvinFS拿了FAST 15最佳论文:找到了失联十三年的小伙伴:年终/年初整理资料,发现做团委工作的 King 师兄对Calvin有兴趣:最近其他团队对分布式事务和存储问题/兴趣较多……几件事激 ...

  3. Linux下安装了Xampp,但命令行使用不了MySQL

    引用:http://www.2cto.com/database/201406/309521.html   刚安装好Xampp,使用localhost也能正常运行, phpMyAdimin也能正常登录 ...

  4. funny alphabet

    1.A Boy Can Do Everything For Girl 2. He Is Just Kidding 3. Love Must Need Our Patience

  5. rails跳过回调的方法

    rails中的回调可跳过,使用下列方法即可: decrement decrement_counter delete delete_all increment increment_counter tog ...

  6. 傻瓜式解读koa中间件处理模块koa-compose

    最近需要单独使用到koa-compose这个模块,虽然使用koa的时候大致知道中间件的执行流程,但是没仔细研究过源码用起来还是不放心(主要是这个模块代码少,多的话也没兴趣去研究了). koa-comp ...

  7. git分支branch合并到主分支master

    如何使用git将分支branch合并到主干master上 对于一人独立使用git进行系统开发时,branch分支相当于版本(Version),如果每次都将新的分支branch提交到GitHub上,则会 ...

  8. C#反射调用外部Dll,执行其中异步函数并取返回值

    using System.Reflection; 1.载入Dll Assembly asm=Assembly.LoadFile(FullPath);//FullPath 为Dll所在位置的全路径. 2 ...

  9. RxJS - Subject(转)

    Observer Pattern 观察者模式定义 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态 ...

  10. 开包即食的教程带你浅尝最新开源的C# Web引擎Blazor

    在今年年初,恰逢新春佳节临近的时候.微软给全球的C#开发者们,着实的送上了一分惊喜.微软正式开源Blazor,将.NET带回到浏览器.     这个小惊喜,迅速的在dotnet开发者中间传开了.201 ...