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);
}
}
责任链: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);
}
}
相关文章推荐
- 设计模式之行为型模式(责任链、命令、解释器、迭代式、仲裁者、备忘录、观察者、状态、策略、模板方法、访问者)
- "围观"设计模式(31)--行为型设计模式总结(模板、观察者、策略、状态、责任链、命令、访问者、中介者、备忘录、解释器)
- 设计模式(二十):访问者模式、迭代器模式、观察者模式、原型模式、模板方法
- C语言和设计模式(访问者模式)
- C语言和设计模式(观察者模式)
- C语言和设计模式(访问者模式) 【文章都是来自网络,只要自己吸取了就是自己的】
- 23种设计模式4--行为型模式(策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式)
- C语言和设计模式(访问者模式)
- 02.C语言和设计模式(访问者模式)
- C语言和设计模式(访问者模式) 24
- 举例讲解Python设计模式编程中的访问者与观察者模式
- 设计模式 行为模式 观察者模式 c语言 版本实现
- 20、C语言和设计模式(观察者模式)
- 举例讲解Python设计模式编程中的访问者与观察者模式
- 设计模式 行为模式 责任链 c语言 版本实现
- 设计模式:行为扩展(访问者,装饰,责任链)
- 23种设计模式4--行为型模式(策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式)
- 设计模式初探 行为模式 观察者模式 c语言 版本实现
- C语言和设计模式(观察者模式)
- 15、C语言和设计模式(访问者模式)