分别用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使用的 ...
随机推荐
- JavaScript -- Constructor、Prototype
----- 012-constructor.html ----- <!DOCTYPE html> <html> <head> <meta http-equiv ...
- arm处理器启动流程分析
2440: 启动方式:nor , nand 地址布局: 启动流程: 开发板在上电后,会从0x0地址处运行. 如果从nor flash启动,则代码要放在nor 的0地址处: 如果从nand flash启 ...
- 解决nginx访问问题connect() to 127.0.0.1:8080 failed (13: Permission denied) while connecting to upstream,
问题:搭建好项目之后,用nginx进行代理,进行日常配置之后,发现前端正常访问,但是后端访问出现错误,报502错误,查找nginx日志,发现connect() to 127.0.0.1:8080 fa ...
- PHP操作MySQL数据库步骤:
简单的PHP操作数据库步骤: 1.连接数据库 $con = mysql_connect('ip','username','password'); 2.选择数据库 mysql_select_ ...
- Android之网络丢包事件
原文链接 http://www.litrin.net/2013/03/01/android%E4%B9%8B%E7%BD%91%E7%BB%9C%E4%B8%A2%E5%8C%85%E4%BA%8B% ...
- c#中引用类型作为值参数和引用参数问题
一.分类 C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型. C#的引用类型包括:数组,用户定义的类.接口.委托,object,字符串. 二.参数传递 对于引用类型, ...
- git常用命令小记
git status 查看缓存区和工作区的状态 +表示N个新文件 ~表示N个修改 -表示N个删除 两组的时候前面的是暂存区,后面的是工作区 git add fileName 变更文件状态(工作区--& ...
- 读取配置文件-AppConfig
using System.Xml; using System.IO; using System; namespace Framework.Common { /// <summary> // ...
- 二十、curator recipes之NodeCache
简介 Curator的NodeCache允许你监听一个节点,当节点数据更改或者节点被删除的时候将会触发监听. 官方文档:http://curator.apache.org/curator-recipe ...
- 为什么java需要序列化对象
序列化是一种用来处理对象流的机制 所谓对象流:就是将对象的内容进行流化,可以对流化后的对象进行读写操作,也可将流化后的对象传输与网络之间 序列化是为了解决在对象流进行读写操作时所引发的问题 序列化的实 ...