求知 文章 文库 Lib 视频 Code iProcess 课程 认证 咨询 工具 火云堂 讲座吧   成长之路  
会员   
要资料
 
追随技术信仰

随时听讲座
每天看新闻
 
 

C语言和设计模式 教程
开篇
单件模式
原型模式
组合模式
模板模式
工厂模式
责任链模式
抽象工厂模式
迭代器模式
外观模式
代理模式
享元模式
装饰模式
适配器模式
策略模式
中介者模式
建造者模式
桥接模式
观察者模式
备忘录模式
解释器模式
命令模式
状态模式
访问者模式
继承、封装、多态
 
 

观察者模式
52 次浏览
11次  
 捐助

观察者模式可能是我们在软件开发中使用得比较多的一种设计模式。为什么这么说?大家可以听我一一到来。我们知道,在windows的软件中,所有的界都是由窗口构成的。对话框是窗口,菜单是窗口,工具栏也是窗口。那么这些窗口,在很多情况下要对一些共有的信息进行处理。比如说,窗口的放大,窗口的减小等等。面对这一情况,观察者模式就是不错的一个选择。

首先,我们可以对这些共有的object进行提炼。

typedef struct _Object  
{
observer* pObserverList[MAX_BINDING_NUMBER];
int number;

void (*notify)(struct _Object* pObject);
void (*add_observer)(observer* pObserver);
void (*del_observer)(observer* pObserver);

}Object;

其实,我们需要定义的就是观察者本身了。就像我们前面说的一样,观察者可以是菜单、工具栏或者是子窗口等等。

typedef struct _Observer  
{
Object* pObject;

void (*update)(struct _Observer* pObserver);
}Observer;

紧接着,我们要做的就是在Observer创建的时候,把observer自身绑定到Object上面。

void bind_observer_to_object(Observer* pObserver, Object* pObject)  
{
assert(NULL != pObserver && NULL != pObject);

pObserver->pObject = pObject;
pObject->add_observer(pObserver);
}

void unbind_observer_from_object(Observer* pObserver, Object* pObject)
{
assert(NULL != pObserver && NULL != pObject);

pObject->del_observer(observer* pObserver);
memset(pObserver, 0, sizeof(Observer));
}

既然Observer在创建的时候就把自己绑定在某一个具体的Object上面,那么Object发生改变的时候,统一更新操作就是一件很容易的事情了。

void notify(struct _Object* pObject)  
{
Obserer* pObserver;
int index;

assert(NULL != pObject);
for(index = 0; index < pObject->number; index++)
{
pObserver = pObjecet->pObserverList[index];
pObserver->update(pObserver);
}
}


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



52 次浏览
11次
 捐助
 

每天2个文档/视频
扫描微信二维码订阅
订阅技术月刊
获得每月300个技术资源
 
 

关于我们 | 联系我们 | 京ICP备10020922号 京公海网安备110108001071号