这三种模式太雷同了。
责任链: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
- 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;
- 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);
- }
- }