分别用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使用的 ...
随机推荐
- Phoenix 4.8
From v4.8.0 onwards, user can enable to map it’s schema to the namespace so that any table created w ...
- Android硬件抽象层(HAL)深入剖析(一)【转】
作为一个搞android驱动或者说搞底层的人,我觉得对于hal那是必须要掌握的,而且必须达到一定深度,于是我总结了一下,将整个自己的分析思路写下来. 主要是看android源代码,根据源代码得到的思路 ...
- Mac下TensorFlow安装及环境搭建
在学习了一段时间台大李宏毅关于deep learning的课程,以及一些其他机器学习的书之后,终于打算开始动手进行一些实践了. 感觉保完研之后散养状态下,学习效率太低了,于是便想白天学习,晚上对白天学 ...
- 中小团队快速构建SQL自动审核系统
SQL审核与执行,作为DBA日常工作中相当重要的一环,一直以来我们都是通过人工的方式来处理,效率低且质量没办法保证.为了规范操作,提高效率,我们决定引入目前市面上非常流行的SQL自动审核工具Incep ...
- pthread和semaphore的简单应用以及四个典型的多线程问题
pthread和semaphore的简单应用以及四个典型的多线程问题 pthread常用函数简单介绍 创建线程 int pthread_create(pthread_t * thread, pt ...
- ZOJ 1203 Swordfish(Prim算法求解MST)
题目: There exists a world within our world A world beneath what we call cyberspace. A world protected ...
- PL/SQL Developer 如何记住密码
前言:使用时总结一下. 问题: 登录的时候不想每次都输入密码,能记住最好了. 解决方案: 1.点击配置->首选项 2.选择登录历史,勾上带口令存储,然后应用,确定即可.
- 洛谷P4783 【模板】矩阵求逆(高斯消元)
题意 题目链接 Sol 首先在原矩阵的右侧放一个单位矩阵 对左侧的矩阵高斯消元 右侧的矩阵即为逆矩阵 // luogu-judger-enable-o2 #include<bits/stdc++ ...
- js-权威指南学习笔记3
第四章 表达式和运算符 1.最简单的表达式是原始表达式,是表达式的最小单位——它们不再包含其他表达式.JS中原始表达式包含常量或直接量.关键字和变量. 2.一个对象的属性名不是固定值时,必须使用方括号 ...
- Hello world &博客客户端试用
第一篇博客,使用 open live writer客户端进行测试,下载地址见http://openlivewriter.org/,软件为英文,但配置比较简单,选择“其他博客类型”就ok. 同时安装了语 ...