C语言设计模式:责任链、观察者和访问者

这三种模式太雷同了。

责任链:In Object Oriented Design, the chain-of-responsibility pattern is a design pattern consisting of a source of command objects and a series ofprocessing objects. Each processing object contains logic that defines the types of command objects that it can handle; the rest are passed to the next processing object in the chain. A mechanism also exists for adding new processing objects to the end of this chain.
观察者:The observer pattern is a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers,and notifies them automatically of any state changes,usually by calling one of their methods. 
访问者:首先我们拥有一个由许多对象构成的对象结构,这些对象的类都拥有一个accept方法用来接受访问者对象;访问者是一个接口,它拥有一个visit方法,这个方法对访问到的对象结构中不同类型的元素作出不同的反应;在对象结构的一次访问过程中,我们遍历整个对象结构,对每一个元素都实施accept方法,在每一个元素的accept方法中回调访问者的visit方法,从而使访问者得以处理对象结构的每一个元素。我们可以针对对象结构设计不同的实在的访问者类来完成不同的操作。


可以简单理解,责任链和访问者都是观察者的变种。观察者通过事件机制通知到各个节点,如果节点只有一个处理者即为责任链模式,如果都处理,则是观察者模式,如果有条件处理,则是访问者模式。


下面是观察者模式的示范代码,如果增加消息类型和返回值判断,可以改造成责任链模式.

http://blog.csdn.net/feixiaoxing/article/details/7172478

[cpp]  view plain copy
  1. typedef struct _Object  
  2. {  
  3.     observer* pObserverList[MAX_BINDING_NUMBER];  
  4.     int number;  
  5.   
  6.     void (*notify)(struct _Object* pObject);  
  7.     void (*add_observer)(observer* pObserver);  
  8.     void (*del_observer)(observer* pObserver);  
  9.   
  10. }Object;  
    其实,我们需要定义的就是观察者本身了。就像我们前面说的一样,观察者可以是菜单、工具栏或者是子窗口等等。

[cpp]  view plain copy
  1. typedef struct _Observer  
  2. {  
  3.     Object* pObject;  
  4.   
  5.     void (*update)(struct _Observer* pObserver);  
  6. }Observer;   
    紧接着,我们要做的就是在Observer创建的时候,把observer自身绑定到Object上面。
[cpp]  view plain copy
  1. void bind_observer_to_object(Observer* pObserver, Object* pObject)  
  2. {  
  3.     assert(NULL != pObserver && NULL != pObject);  
  4.   
  5.     pObserver->pObject = pObject;  
  6.     pObject->add_observer(pObserver);  
  7. }        
  8.   
  9. void unbind_observer_from_object(Observer* pObserver, Object* pObject)  
  10. {  
  11.     assert(NULL != pObserver && NULL != pObject);  
  12.   
  13.     pObject->del_observer(observer* pObserver);  
  14.     memset(pObserver, 0, sizeof(Observer));  
  15. }  

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

[cpp]  view plain copy
  1. void notify(struct _Object* pObject)  
  2. {  
  3.     Obserer* pObserver;  
  4.     int index;  
  5.   
  6.     assert(NULL != pObject);  
  7.     for(index = 0; index < pObject->number; index++)  
  8.     {  
  9.         pObserver = pObjecet->pObserverList[index];  
  10.         pObserver->update(pObserver);  
  11.     }  
  12. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值