分别用C/C++ 和 C#实现简单的观察者模式
网上找了很多关于观察者模式的代码例子和文章,都写的比较复杂,我个人还是喜欢从易到难,今天自己参考网上资料,也写了一个简单观察者模式的例子,简单的复习了一下Observer 模式,Observer 模式使用一对多的方式,可以让多个观察者同时关注同一个事物,并作出不同的响应。
例如下面的例子,Manager的底薪为基本工资的1.6倍,Employee的底薪为基本工资的1.2倍。Observer 类的Attach方法与Detach方法可以用于注册和注销观察者,最后执行Execute方法可以对多个已注册的观察者同时输入参数。
开发 Observer 模式时借助委托,可以进一步简化开发的过程。由于委托对象支持多路广播,在Observer 类中建立了一个委托对象wageHandler,通过Attach与Detach方法可以分别加入或取消委托。如果观察者想对事物进行监测,只需要加入一个委托对象即可。然后委托的GetInvodationList方法能获取多路广播委托列表,在Execute方法中,就是通过去多路广播委托列表去判断所绑定的委托数量是否为0。
- public delegate double Handler(double wages);
- public class Manager
- {
- public double GetWages(double basicWages)
- {
- double totalWages = 1.6 * basicWages;
- Console.WriteLine("Manager's wages is : " + totalWages);
- return totalWages;
- }
- }
- public class Employee
- {
- public double GetWages(double basicWages)
- {
- double totalWages = 1.2 * basicWages;
- Console.WriteLine("Employee's wages is : " + totalWages);
- return totalWages;
- }
- }
- public class Observe
- {
- public Handler WageHandler { get; set; }
- //通过GetInvodationList方法获取多路广播委托列表,如果观察者数量大于0即执行方法
- public void Execute(double basicWages)
- {
- if (WageHandler != null)
- if (WageHandler.GetInvocationList().Count() > )
- WageHandler(basicWages);
- }
- }
- class Program
- {
- static void Main(string[] args)
- {
- Observe wageManager = new Observe();
- //加入Manager观察者
- wageManager.WageHandler += new Handler(new Manager().GetWages);
- //加入Employee观察者
- wageManager.WageHandler += new Handler(new Employee().GetWages);
- //同时加入底薪3000元,分别进行计算
- wageManager.Execute();
- Console.ReadKey();
- }
- }
执行结果:
然后为了加大难度,又用C++编写了一个类似例子来实现观察者模式,当然C++编写起来相对C#会复杂一些,而且最终实现效果没有C#好,但是一切都是为了更好的学习和理解语言,这波还是不亏的,C++里面有个和委托类似的东西,它的名字叫函数指针,然后用set存放函数指针,遍历执行
- #include "stdafx.h"
- using namespace std;
- typedef double(*Handler)(double wages);//定义函数指针,功能和C#中的委托类似
- class Manager
- {
- public:
- static double GetWages(double basicWages) {
- double totalWages = 1.6*basicWages;
- cout << "Manager's wages is : " << totalWages << endl;
- return totalWages;
- }
- };
- class Employee
- {
- public:
- static double GetWages(double basicWages) {
- double totalWages = 1.2*basicWages;
- cout << "Employee's wages is : " << totalWages << endl;
- return totalWages;
- }
- };
- class Observe
- {
- public:
- set<Handler> set;
- //加入观察者
- void Attach(Handler wageHandler1) {
- set.insert(wageHandler1);
- }
- //删除观察者
- void Detach(Handler wageHandler1) {
- set.erase(wageHandler1);
- }
- void Execute(double basicWages) {
- if (NULL != &set)
- {
- if (set.size() > )
- {
- typename std::set<Handler>::iterator it;//list<T>前面需要用typename限定一下,因为编译器不知道list<T>::iterator是代表一个类型。list<T>::iterator iter; 改为 typename std::list<T>::iterator iter;
- for (it = set.begin(); it != set.end(); it++)
- {
- (*it)(basicWages);
- }
- }
- }
- }
- };
- int main()
- {
- Manager man;
- Employee emp;
- Observe observe;
- //加入Manager观察者
- Handler managerHandler = &(man.GetWages);
- observe.Attach(managerHandler);
- //加入Employee观察者
- Handler employeeHandler = &(emp.GetWages);
- observe.Attach(employeeHandler);
- //同时加入底薪3000元,分别进行计算
- observe.Execute();
- system("pause");
- return ;
- }
哈哈,大功告成,撸这种在老板面前一文不值,自己却撸的很嗨的代码,还真是很开心的呢^^,也许这就是程序猿才能明白的快乐吧
分别用C/C++ 和 C#实现简单的观察者模式的更多相关文章
- 一个简单的观察者模式的JS实现
这不是原创文章,主要是写给自己看的.原文比较详细容易让人,我提取最简单最好理解的部分,便于我以后用到.参考http://www.cnblogs.com/TomXu/archive/2012/03/02 ...
- JS实现简单的观察者模式
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- .net 多播委托的使用方法以及场景,更简单的观察者模式
首先来说一下什么是多播委托 多播委托就是在委托里定义一个或者多个方法的一个集合 使用方法: public Action actList; //添加方法 public void AddActionMet ...
- PHP 高级编程(3/5) - 使用SPL(标准PHP库)实现观察者模式
SPL(标准PHP库 - Standard PHP Library)是PHP5面向对象功能中重要的部分.原文解释是这样的“The Standard PHP Library (SPL) is a col ...
- 设计模式--观察者模式初探和java Observable模式
初步认识观察者模式 观察者模式又称为发布/订阅(Publish/Subscribe)模式,因此我们可以用报纸期刊的订阅来形象的说明: 报社方负责出版报纸. 你订阅了该报社的报纸,那么只要报社发布了新报 ...
- Java程序员学习之路
1. Java语言基础 谈到Java语 言基础学习的书籍,大家肯定会推荐Bruce Eckel的<Thinking in Java>.它是一本写的相当深刻的技术书籍,Java语言基础部分基 ...
- Vue 源码解析:深入响应式原理(上)
原文链接:http://www.imooc.com/article/14466 Vue.js 最显著的功能就是响应式系统,它是一个典型的 MVVM 框架,模型(Model)只是普通的 JavaScri ...
- (六)观察者模式详解(包含观察者模式JDK的漏洞以及事件驱动模型)
作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 本章我们讨论一个除前面的单例 ...
- Orchard源码分析(4.3):Orchard.Events.EventsModule类(Event Bus)
概述 采用Event Bus模式(事件总线),可以使观察者模式中的观察者和被观察者实现解耦. 在.Net 中使用观察者模式,可以使用事件(委托)和接口(类).Orchard Event Bus使用的 ...
随机推荐
- Android_设置全屏的方法
在开发的过程中,我们有时候需要让我们应用程序全屏或者是让某个页面全屏,在今天的android小技巧中我们来讲讲如何设置我们的应用程序 全屏: 通常我们有三种方式: 1.在onCreate方法中添加代码 ...
- 几句话说说跨IDC分布式数据库Calvin
CalvinFS拿了FAST 15最佳论文:找到了失联十三年的小伙伴:年终/年初整理资料,发现做团委工作的 King 师兄对Calvin有兴趣:最近其他团队对分布式事务和存储问题/兴趣较多……几件事激 ...
- Linux下安装了Xampp,但命令行使用不了MySQL
引用:http://www.2cto.com/database/201406/309521.html 刚安装好Xampp,使用localhost也能正常运行, phpMyAdimin也能正常登录 ...
- funny alphabet
1.A Boy Can Do Everything For Girl 2. He Is Just Kidding 3. Love Must Need Our Patience
- rails跳过回调的方法
rails中的回调可跳过,使用下列方法即可: decrement decrement_counter delete delete_all increment increment_counter tog ...
- 傻瓜式解读koa中间件处理模块koa-compose
最近需要单独使用到koa-compose这个模块,虽然使用koa的时候大致知道中间件的执行流程,但是没仔细研究过源码用起来还是不放心(主要是这个模块代码少,多的话也没兴趣去研究了). koa-comp ...
- git分支branch合并到主分支master
如何使用git将分支branch合并到主干master上 对于一人独立使用git进行系统开发时,branch分支相当于版本(Version),如果每次都将新的分支branch提交到GitHub上,则会 ...
- C#反射调用外部Dll,执行其中异步函数并取返回值
using System.Reflection; 1.载入Dll Assembly asm=Assembly.LoadFile(FullPath);//FullPath 为Dll所在位置的全路径. 2 ...
- RxJS - Subject(转)
Observer Pattern 观察者模式定义 观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态 ...
- 开包即食的教程带你浅尝最新开源的C# Web引擎Blazor
在今年年初,恰逢新春佳节临近的时候.微软给全球的C#开发者们,着实的送上了一分惊喜.微软正式开源Blazor,将.NET带回到浏览器. 这个小惊喜,迅速的在dotnet开发者中间传开了.201 ...