一、概念定义
Observer模式又称为发布-订阅模式。
Observer模式:定义了一种一对多的依赖关系,让多个观察者(Observer)同时监听某一主题对象(Subject)。当这个主题对象(Subject)的状态发生变化时,会通知观察者对象(Observer),让他们能够自动更新自己。
二、模式结构图
图1 Observer模式结构图
三、场景设计
当同一组数据进行分析统计时,我们希望能够提供多种形式的表示,如:以表格统计显示、以柱状图统计显示、以百分比统计显示等等。这些表示都依赖于同一组数据,当这些数据发生改变时,所有的统计显示同时也要发生变化。
四、C语言实现
分析:表格显示、柱状图显示和百分比显示相当于观察者(Observer),而统计数据相当于被观察的主题对象(Subject)。(注:使用C语言实现设计模式时,可以根据具体场景,将类理解为结构体或一组函数(组件)等)
// 类型定义(Observer和Subject)
1. 观察者
// 观察者回调
typedef struct
{
...
void (*update)(int);
...
}observer_t;
2. 被观察者
// 观察者链表
typedef struct _observer_link_t
{
observer_t *observer;
struct _observer_link_t *next;
}observer_link_t;
// 被观察者
typedef struct _subject_t
{
int data; // 被观察数据
observer_link_t *observer; // 观察者链表(队列)
}subject_t;
// 更新统计(观察者更新)
1. 更新 表格统计显示
void updateform(int data){...}
...
2. 更新 柱状图统计显示
void updatecylinder(int data){...}
...
3. 更新 百分比统计显示
void updatepercent(int data){...}
...
4. 初始化观察者
void initobserver(observer_t *observer, void (*update)(int))
{
...
observer.update = update;
...
}
...
// 统计数据(Subject接口)
// 加入观察者队列
int attachobserver(subject_t *subject, observer_t *observer)
{
// 将observer加入subject中的observer链表
}
// 从观察者队列删除
int detachobserver(subject_t *subject, observer_t *observer)
{
// 将observer踢出subject中的observer链表
}
// 修改被观察数据
int setdata(subject_t *subject, int *value)
{
subject->data = value;
}
// 通知观察者
void notifyobserver(subject_t *subject)
{
observer_link_t *node = subject->observer;
while(NULL != node)
{
node->update(subject->data);
}
...
}
// 初始化主题对象
void initsubject(subject_t *subject)
{
memset(subject, 0, sizeof(subject_t));
subject->observer = NULL;
}
// Observer模式使用
int main(int argc, const char *agrc[])
{
observer_t form; // 表格对象
observer_t cylinder; // 柱状图对象
observer_t percent; // 百分比对象
subject_t subject; // 统计数据
// 初始化观察者
initobserver(&form, updateform);
initobserver(&cylinder, updatecylinder);
initobserver(&percent, updatepercent);
// 初始化被观察者
initsubject(&subject);
// 观察者关注subject
attachobserver(&subject, &form);
attachobserver(&subject, &cylinder);
attachobserver(&subject, &percent);
// 修改状态,并通知观察者
setdata(&subject, 1);
notifyobserver(&subject);
setdata(&subject, 2);
notifyobserver(&subject);
...
return 0;
}
作者:邹祁峰
2012.11.15
一、概念定义
Observer模式又称为发布-订阅模式。
Observer模式:定义了一种一对多的依赖关系,让多个观察者(Observer)同时监听某一主题对象(Subject)。当这个主题对象(Subject)的状态发生变化时,会通知观察者对象(Observer),让他们能够自动更新自己。
二、模式结构图
图1 Observer模式结构图
三、场景设计
当同一组数据进行分析统计时,我们希望能够提供多种形式的表示,如:以表格统计显示、以柱状图统计显示、以百分比统计显示等等。这些表示都依赖于同一组数据,当这些数据发生改变时,所有的统计显示同时也要发生变化。
四、C语言实现
分析:表格显示、柱状图显示和百分比显示相当于观察者(Observer),而统计数据相当于被观察的主题对象(Subject)。(注:使用C语言实现设计模式时,可以根据具体场景,将类理解为结构体或一组函数(组件)等)
// 类型定义(Observer和Subject)
1. 观察者
// 观察者回调
typedef struct
{
...
void (*update)(int);
...
}observer_t;
2. 被观察者
// 观察者链表
typedef struct _observer_link_t
{
observer_t *observer;
struct _observer_link_t *next;
}observer_link_t;
// 被观察者
typedef struct _subject_t
{
int data; // 被观察数据
observer_link_t *observer; // 观察者链表(队列)
}subject_t;
// 更新统计(观察者更新)
1. 更新 表格统计显示
void updateform(int data){...}
...
2. 更新 柱状图统计显示
void updatecylinder(int data){...}
...
3. 更新 百分比统计显示
void updatepercent(int data){...}
...
4. 初始化观察者
void initobserver(observer_t *observer, void (*update)(int))
{
...
observer.update = update;
...
}
...
// 统计数据(Subject接口)
// 加入观察者队列
int attachobserver(subject_t *subject, observer_t *observer)
{
// 将observer加入subject中的observer链表
}
// 从观察者队列删除
int detachobserver(subject_t *subject, observer_t *observer)
{
// 将observer踢出subject中的observer链表
}
// 修改被观察数据
int setdata(subject_t *subject, int *value)
{
subject->data = value;
}
// 通知观察者
void notifyobserver(subject_t *subject)
{
observer_link_t *node = subject->observer;
while(NULL != node)
{
node->update(subject->data);
}
...
}
// 初始化主题对象
void initsubject(subject_t *subject)
{
memset(subject, 0, sizeof(subject_t));
subject->observer = NULL;
}
// Observer模式使用
int main(int argc, const char *agrc[])
{
observer_t form; // 表格对象
observer_t cylinder; // 柱状图对象
observer_t percent; // 百分比对象
subject_t subject; // 统计数据
// 初始化观察者
initobserver(&form, updateform);
initobserver(&cylinder, updatecylinder);
initobserver(&percent, updatepercent);
// 初始化被观察者
initsubject(&subject);
// 观察者关注subject
attachobserver(&subject, &form);
attachobserver(&subject, &cylinder);
attachobserver(&subject, &percent);
// 修改状态,并通知观察者
setdata(&subject, 1);
notifyobserver(&subject);
setdata(&subject, 2);
notifyobserver(&subject);
...
return 0;
}
作者:邹祁峰
2012.11.15
分享到:
相关推荐
设计模式C++学习之观察者模式(Observer)
观察者模式通常的叫法叫做订阅-发布模式,类似于报刊杂志的订阅,观察者和被观察者就是读者和邮局的关系,读者先要在邮局订阅想要的报刊,当报刊发行时,邮局会将报刊邮寄到读者家里。观察者(Observer)和被观察者...
C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式
观察者模式(Observer) 用意:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。
C#面向对象设计模式纵横谈(19):(行为型模式) Observer 观察者模式 (Level 300)
用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...
可以有任意多个观察者观察同一个目标。 提供注册和删除观察者对象的接口。 2.Observer(观察者) 为那些在目标发生改变时需获得通知的对象定义一个更新接口。 3.ConcreteSubject(具体目标) 将有关状态存入...
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
结合微信公众号讲解观察者模式,生动形象,关键是上手快啊
设计模式精解-GoF 23种设计模式解析附C++实现源码 AbstractFactory模式、Adapater模式、Composite模式、Decorator模式、Factory模式、Observer模式、Strategy模式、Template模式
Observer设计模式是一种经典的设计模式,在GOF 23种设计模式种 比较常用于实际。主要是有类指针传递并引用方法和消息传递响应的方法来实现。
我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...
23种Python设计模式示例...Interpreter解释器模式,Iterator迭代器模式,Mediator中介者模式、Singleton光身汉模式,Observer观察者模式等,一共23种,这里不一一列举了,每一种模式代码,都包括了中文注解,利于学习。
设计模式体现的是一种思想,而思想则是指导行为的一切,理解和掌握了设计模式,并不是说记住了23种(或更多)设计场景和解决策略(实际上这也是很重要的一笔财富),实际接受的是一种思想的熏陶和洗礼,等这种思想...
Observer (观察者模式) 又叫做发布/订阅(Publish/Subscribe)模式。 当一个对象的改变同时会影响其他对象的行为的时候,可以使用此设计模式。 l 主题对象 :一个需要被关注的主题对象,这个主题对象改变会影响...
观察者模式(Observer Pattern)是一种对象行为型设计模式,它定义了对象之间的一对多依赖关系。 当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于实现分布式事件处理系统...
设计模式精解- GoF 23 种设计模式解析附 C++实现源码 目 录 0 引言 ...........................................................................................................................................
observer观察者模式
1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、...