文档章节

设计模式 行为模式 观察者模式 c语言 版本实现

回家吃饭
 回家吃饭
发布于 2013/07/28 11:12
字数 477
阅读 136
收藏 0

    上午简单的学习了观察者模式,首先想到的是群邮件和微博加粉丝。于是写了个凤姐与粉丝的小程序。

 

 

    简单的模拟了凤姐的新鲜事发送给她的粉丝这一过程。

/**设计模式 行为模式 观察者模式 凤姐与粉丝
  *2013年7月28 cheqiang87@qq.com  *
 */
#include <stdio.h>
#include <stdlib.h>
struct Fans {
    struct Fengjie* fengjie;
    void ( *update) ();                             //粉丝获得凤姐的新状态,被动获得
    void ( *joinfans)(struct Fans fans);            //粉丝有权选择成为凤姐粉丝
    void ( *quitfans)();                            //粉丝有权选择退出凤姐粉丝圈
};
struct Fengjie {
    int fansnum;
    struct Fans fanslist[100];                     //负责通知的粉丝的数量,最多100个粉丝
    void ( *notify) (struct Fengjie* fengjie);     //由凤姐发出更新通知
    void ( *addfans)(struct Fengjie* fengjie, struct Fans fans);    //凤姐这边也可以增加删除粉丝
 //   void ( *)delfans)();                            //to be done
};
void fan1update(){                                  //不同粉丝收到新信息后有不同行为
    printf ("fan1 got new news! Unbelievable,Fengjie weight %d now!\n",rand()%10 +50);
}
void fan2update(){                                  //不同粉丝收到新信息后有不同行为
    printf ("fan2 got new news! Fengjie's new weight is %d , oh my god.\n",rand()%10 +50);
}
void joinfans(struct Fans fans) {
    fans.fengjie->addfans(fans.fengjie, fans);      //粉丝这边直接调用凤姐的函数来把该粉丝加入粉丝圈
}

void notify (struct Fengjie* fengjie){
    int i;
    for (i = 0; i < fengjie->fansnum; i++)
        fengjie->fanslist[i].update();
}
void addfans (struct Fengjie* fengjie, struct Fans fans) {
    fengjie->fanslist[fengjie->fansnum] = fans;
    fengjie->fansnum++;
}
int main (void) {
    srand((unsigned) time(0));
    struct Fengjie fengjie;
    fengjie.notify = notify, fengjie.addfans = addfans, fengjie.fansnum = 0;

    struct Fans fan1, fan2;
    fan1.fengjie = &fengjie, fan1.joinfans = joinfans, fan1.update = fan1update;
    fan2.fengjie = &fengjie, fan2.joinfans = joinfans, fan2.update = fan2update;
    fan1.joinfans (fan1);
    fan2.joinfans (fan2);

    fengjie.notify (&fengjie);




}
另外可以根据不同的粉丝写相应的update响应,这又让我想到了网上说的控件菜单等对明令的响应。
观察者只要发现目标有什么风吹草动就会采取行动,这时该称为监视者。

 

 

© 著作权归作者所有

回家吃饭
粉丝 0
博文 2
码字总数 724
作品 0
哈尔滨
程序员
私信 提问
JavaScript设计模式总结

之前看过《JavaScript设计模式与开发实践》这本书,对书中的设计模式和一些相关案例也有了一定的了解,同时把这些设计模式的应用对应在在一些其他的项目中,进行了一些整理,如下仅供参考: ...

jefferyE
03/26
0
0
JavaScript 的一些设计模式

设计模式的定义:在面向对象软件设计过程中针对特定问题的简洁而优雅的解决方案 设计模式是前人解决某个特定场景下对而总结出来的一些解决方案。可能刚开始接触编程还没有什么经验的时候,会...

格西南
08/20
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
286
2
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
2018/05/08
293
0
设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信
2018/03/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

zk中ToBeAppliedRequestProcessor解析

ToBeAppliedRequestProcessor在Leader中 在已处理事务和最后处理事务处理器之间,处理器链上下一个是FinalRequestProcessor public void processRequest(Request request) throws RequestPro...

writeademo
10分钟前
1
0
Allegro快捷键设置-PCB环境

立题简介: 内容:简单介绍Allegro绘制的PCB环境下的快捷键; 来源:实际使用得出; 作用:对Allegro绘制PCB快捷键进行介绍; PCB环境:Cadence 16.6; 立题详解: 对“allegro”板而言,其在...

demyar
11分钟前
1
0
idea maven web项目启动build时报错java.lang.NullPointerException

之前还好好的,重启一下idea就报这个错了,大概率是tomcat没杀掉端口被占用了,在tomcat配置中更换一下sever端口就好了

宇辰OSC
15分钟前
1
0
weed3-2.3.1.查询之输出

Weed3 一个超轻量级ORM框架(只有0.1Mb哦) 源码:https://github.com/noear/weed3 源码:https://gitee.com/noear/weed3 查询可是个复杂的话题了,可能我们80%的数据库处理都在查询。 今天先...

刘之西东
15分钟前
1
0
【Android JetPack系列】数据绑定:DataBinding

参考MVVM

Agnes2017
23分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部