1. 说说简单的函数回调
首先说说一种简单的函数回调机制(一种通过获取对象的指针来进行函数的调用方法)下面是代码演示---
这是观察者(被回调)部分:
class Observer
{
public:
// 抽象观察者的纯虚函数
virtual void UpdateMessage() = 0;
};
class ConcreteObserver : public Observer
{
public:
// 实现抽象类的纯虚函数
void UpdateMessage();
}
void ConcreteObserver::UpdateMessage()
{
// 这里实现具体的操作
}
class Subject
{
public:
Subject(Observer* observer = NULL);
void OnMessageChanged();
private:
Observer* m_observer;
};
下面是被观察者(主动调用)部分:
Subject::Subject(Observer* observer)
{
// 将Observer的对象指针传进来并复制
m_observer = observer;
}
void Subject::OnMessageChanged()
{
if(m_observer)
{
// 通过多态机制下的指针回调观察者的函数
m_observer->UpdateMessage();
}
}
如上所示,程序中的一个对象通过获取另一个对象的指针,来进行函数的调用。这不是类之间的直接调用,只因该对象指针是在多态下定义的。
进一步拓展,如果有一个或多个多个观察者来关注一个或多个对象,那么就可以用通常所说的观察者模式来实现了。
2. 观察者模式的应用场合和特点
观察者模式一般出现在这样的场合:存在观察者和被观察对象。具体例子,比如订阅邮件或杂志, 微博关注某某主题等。当你在微博上关注了某个主题后,当这个主题有新的信息发出来时,你的微博主页将会相应收到它的更新信息。
而观察者模式提供了这样的一个对象模型,使得对象们(主题和观察者)之间松耦合:
(1)观察者的更替或数据模块的更新不会影响主题的存在。
(2)观察者和主题类可以方便的独立地被程序其他模块使用。
(3)一个主题可以注册多个观察者,也可以动态删除观察者; 一个观察者也可以注册多个主题,也可以撤销注册。
例如一份天气预报可以被多个用户订阅,当数据更新时会通知所有注册的用户。一个用户也可以订阅多份天气预报,广州的,珠海的等等。
3.简单的代码演示
(1)演示的功能可以用这个类图来表达,类图中定义了Subject和Observer两个接口,并定义了两个具体主题类和三个具体观察者类。
(2)具体代码实现
首先是主题类,分别定义了类ConcreteSubjectA和类ConcreteSubjectB。
class Subject
{
public:
virtual void registerObserver(shared_ptr<Observer> observer) = 0;
virtual void removeObserver(shared_ptr<Observer> observer) = 0;
virtual void notifyObserver() = 0;
};
class ConcreteSubjectA : public Subject
{
public:
ConcreteSubjectA()
{
// do something here
testValue = 1;
}
void registerObserver(shared_ptr<Observer> observer)
{
observersList.push_back(observer);
}
void removeObserver(shared_ptr<Observer> observer)
{
observersList.remove(observer);
}
void notifyObserver()
{
for (list<shared_ptr<Observer> >::iterator it = observersList.begin();
it != observersList.end(); ++it)
{
(*it)->updateData(testValue);
}
}
private:
list<shared_ptr<Observer> > observersList;
int testValue;
};
class ConcreteSubjectB : public Subject
{
public:
ConcreteSubjectB()
{
// do something here
testValue = 2;
}
void registerObserver(shared_ptr<Observer> observer)
{
observersList.push_back(observer);
}
void removeObserver(shared_ptr<Observer> observer)
{
observersList.remove(observer);
}
void notifyObserver()
{
for (list<shared_ptr<Observer> >::iterator it = observersList.begin();
it != observersList.end(); ++it)
{
(*it)->updateData(testValue);
}
}
private:
list<shared_ptr<Observer> > observersList;
int testValue;
};
接着是观察者类,分别定义了类ConcreteObserverA,类ConcreteObserveB,类ConcreteObserverC。
class Observer
{
public:
virtual void updateData(int val) = 0;
};
class ConcreteObserverA : public Observer
{
public:
void updateData(int val)
{
// do something here
cout << "In A :" << val <<endl;
}
};
class ConcreteObserverB : public Observer
{
public:
void updateData(int val)
{
// do something here
cout << "In B :" << val <<endl;
}
};
class ConcreteObserverC : public Observer
{
public:
void updateData(int val)
{
// do something here
cout << "In C :" <<val <<endl;
}
};
然后,我们可以这样使用他们:
int main()
{
shared_ptr<Subject> subjectA(new ConcreteSubjectA());
shared_ptr<Subject> subjectB(new ConcreteSubjectB());
shared_ptr<Observer> observerA(new ConcreteObserverA());
shared_ptr<Observer> observerB(new ConcreteObserverB());
shared_ptr<Observer> observerC(new ConcreteObserverC());
subjectA->registerObserver(observerA);
subjectA->registerObserver(observerB);
subjectB->registerObserver(observerC);
// 主题A有更新时将通知观察者A,B
subjectA->notifyObserver();
// 主题B有更新时将通知观察者C
subjectB->notifyObserver();
return 0;
}
分享到:
相关推荐
设计模式专题之(十八)观察者模式--设计模式观察者模式示例代码(python--c++)
设计模式--观察者 c++版本 有源码能运行
c++设计模式-行为型模式-观察者模式;qt工程;c++简单源码; 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式...
观察者模式,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
创建型模式,共五种:工厂方法模式、抽象工厂模式、...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
设计模式C++学习之观察者模式(Observer)
HeadFirst 设计模式学习笔记2--观察者模式 demo http://blog.csdn.net/laszloyu/archive/2010/05/12/5581769.aspx
5.7 OBSERVER(观察者)—对象行为型模式 194 5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型模式 208 5.10 TEMPLATE METHOD(模板方法)—类行为型模式 214 5.11 VISITOR(访问者)—...
设计模式C++-观察者模式.doc
用c++和lua实现的观察者模式小栗子,其中c++版本参考了别人的实现
head first 设计模式 观察者模式 C++ 代码
工厂,状态,观察者等18种设计模式 每一种设计模式有详细介绍,代码(C++),UML图工厂,状态,观察者等18种设计模式 每一种设计模式有详细介绍,代码(C++),UML图工厂,状态,观察者等18种设计模式 每一种设计...
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 Observer Pattern defines a one-to-many dependency between objects so that when one object ...
Qt设计模式之观察者模式
对应的博客链接:http://blog.csdn.net/t1234xy4/article/details/52432559#
C++设计模式代码资源5_观察者模式.zip
观察者模式的 C++ 实现, 使用标准C++,在XCode实现。
一个对象的形态是由另一个对象决定的!这样的模式就可以考虑使用观察者设计模式! 附件内有类图!可以直接编译运行!
设计模式中观察者模式的实现和测试代码,学习用。
最近在看head first 设计模式,书上的例子是用java编写的....希望这写代码也能帮助别人学习c++和设计模式. 现在上传了第二章的代码,. 要是大家对这个感兴趣,就继续上传. 代码是在linux下编写的,windows下也可以编译运行.