您的位置:首页 > 编程语言 > C语言/C++

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

2013-02-11 18:25 393 查看
这三种模式太雷同了。

责任链: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方法,从而使访问者得以处理对象结构的每一个元素。我们可以针对对象结构设计不同的实在的访问者类来完成不同的操作。

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

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

/article/1797620.html

[cpp] view
plaincopy

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;

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

[cpp] view
plaincopy

typedef struct _Observer

{

Object* pObject;

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

}Observer;

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

[cpp] view
plaincopy

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发生改变的时候,统一更新操作就是一件很容易的事情了。

[cpp] view
plaincopy

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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐