如何实现观察者模式 - 纳金网
联系我们

给我们留言

联系我们

地址:福建省晋江市青阳街道洪山路国际工业设计园纳金网

邮箱:info@narkii.com

电话:0595-82682267

(周一到周五, 周六周日休息)

当前位置:主页 > 3D教程 > 图文教程

如何实现观察者模式

来源: 未知 | 责任编辑:六月芳菲 | 发布时间: 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接口
 

#include "Observer.h"
class 
Subject{
public
:
virtual 
void 
registerObserver(Observer *obs)=0;
virtual 
void 
removeObserver(Observer *obs)=0;
virtual 
void 
notifyObserver()=0;
};
Subject类中的三个方法都必须是虚函数。 一个具体的类将继承这个类,并要求具体子类必须实现三个虚拟方法。
 
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();
};
当NewsStation类需要通知其订阅用户时,它只要通过遍历向量并发送更新。
 
代码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显示了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条

推荐
热门