如何实现观察者模式
来源:
未知 |
责任编辑:六月芳菲 |
发布时间: 2018-03-02 09:24 | 浏览量:
更多精彩unity教程:http://www.narkii.com/resource/
观察者设计模式遵循面向对象编程的一个最重要的原则。 这个原则是:
努力实现交互对象之间的低耦合设计。
这意味着你的类应该能够相互交互,但彼此之间知道很少对方内部细节。这本质上意味着你的类应该具有低耦合性。
一个好的类比,有助于了解观察者设计模式是如何工作的,如报纸订阅。
报纸和订阅者彼此都有内部知识信息,但他们能够互动。报纸用新闻更新订阅用户,订阅用户读它们提供的新闻。
实现观察者模式
我们将在C++中实现观察者设计模式。我们将使用抽象类来实现接口的概念。
我们会创建两个接口,其名称为:Subject和Observer。Subject接口将包含注册,删除和通知Observer对象的虚函数。
Observer接口将有一个使用来自Subject对象的信息更新的虚函数。
然后我们将创建两个具体的类,实现每个接口的虚函数。
将实现Subject接口的类将充当新闻站。它将注册并通知其订阅者最新消息。
实现Observer接口的类将充当订阅者。它将预订自己的Subject接口并接收任何通知。
更多精彩unity教程:http://www.narkii.com/resource/
Subject接口的实现
Subject接口的实现非常简单。回想一下,在C ++中创建一个接口,你必须让类成为一个抽象类,通过使用虚函数并将其初始化为0。
代码1显示了Subject接口的实现。
代码1:Subject接口
Subject类中的三个方法都必须是虚函数。 一个具体的类将继承这个类,并要求具体子类必须实现三个虚拟方法。
Observer接口的实现
Observer接口的实现遵循与Subject接口相同的逻辑。但是,此接口只需要一个虚函数。
代码2显示了Observer接口的实现。
一个具体的类也将继承这个类,并且必须实现虚函数update方法。
代码2: Observer 接口
NewsStation类实现
代码3和4显示了NewsStation类的实现。
具体类中包含一个向量来存储Observer对象。
代码3. NewsStation.h文件
当NewsStation类需要通知其订阅用户时,它只要通过遍历向量并发送更新。
代码4:Newspaper方法实现
实现NewsReader类
代码5和6中显示了NewsReader类的实现。
注意,我们有一个指向Subject接口的指针,如代码5所示。
在创建NewsReader类之后,我们将对象注册到Subject接口,在本例中是注册到NewsStation类中。
代码5:NewsReader.h文件
代码6显示了Update方法的实现。它只是输出读者已经被通知的消息。
代码6. NewsReader方法实现
[table][tr][td]
void
NewsReader::update(){
//Output:"I am the news reader that was notified"
cout
更多精彩unity教程:http://www.narkii.com/resource/
观察者设计模式遵循面向对象编程的一个最重要的原则。 这个原则是:
努力实现交互对象之间的低耦合设计。
这意味着你的类应该能够相互交互,但彼此之间知道很少对方内部细节。这本质上意味着你的类应该具有低耦合性。
一个好的类比,有助于了解观察者设计模式是如何工作的,如报纸订阅。
报纸和订阅者彼此都有内部知识信息,但他们能够互动。报纸用新闻更新订阅用户,订阅用户读它们提供的新闻。
实现观察者模式
我们将在C++中实现观察者设计模式。我们将使用抽象类来实现接口的概念。
我们会创建两个接口,其名称为:Subject和Observer。Subject接口将包含注册,删除和通知Observer对象的虚函数。
Observer接口将有一个使用来自Subject对象的信息更新的虚函数。
然后我们将创建两个具体的类,实现每个接口的虚函数。
将实现Subject接口的类将充当新闻站。它将注册并通知其订阅者最新消息。
实现Observer接口的类将充当订阅者。它将预订自己的Subject接口并接收任何通知。
更多精彩unity教程:http://www.narkii.com/resource/
Subject接口的实现
Subject接口的实现非常简单。回想一下,在C ++中创建一个接口,你必须让类成为一个抽象类,通过使用虚函数并将其初始化为0。
代码1显示了Subject接口的实现。
代码1:Subject接口
#include "Observer.h" class Subject{ public : virtual void registerObserver(Observer *obs)=0; virtual void removeObserver(Observer *obs)=0; virtual void notifyObserver()=0; }; |
Observer接口的实现
Observer接口的实现遵循与Subject接口相同的逻辑。但是,此接口只需要一个虚函数。
代码2显示了Observer接口的实现。
一个具体的类也将继承这个类,并且必须实现虚函数update方法。
代码2: Observer 接口
class Observer{ public : virtual void update()=0; }; |
NewsStation类实现
代码3和4显示了NewsStation类的实现。
具体类中包含一个向量来存储Observer对象。
代码3. NewsStation.h文件
class NewsStation: public Subject{ public : //vector to store all register observers vector observers; //constructor NewsStation(){}; //method to register observer void registerObserver(Observer *obs); //method to remove observer void removeObserver(Observer *obs); //method to notify observer void notifyObserver(); }; |
代码4:Newspaper方法实现
void NewsStation::registerObserver(Observer *obs){ observers.push_back(obs); } void NewsStation::removeObserver(Observer *obs){ observers.erase(find(observers.begin(), observers.end(), obs)); } void NewsStation::notifyObserver(){ //search for all register observers for ( int i=0; iupdate(); } } |
实现NewsReader类
代码5和6中显示了NewsReader类的实现。
注意,我们有一个指向Subject接口的指针,如代码5所示。
在创建NewsReader类之后,我们将对象注册到Subject接口,在本例中是注册到NewsStation类中。
代码5:NewsReader.h文件
#include "Subject.h" class NewsReader: public Observer{ public : Subject *subject; //Note that we are registering the newsreader to the Subject class during initialization NewsReader(Subject *sub){ subject=sub; subject->registerObserver( this ); } void update(); }; |
代码6. NewsReader方法实现
[table][tr][td]
void
NewsReader::update(){
//Output:"I am the news reader that was notified"
cout
更多精彩unity教程:http://www.narkii.com/resource/
相关文章
网友评论
全部评论:0条
推荐
热门