观察者模式(Observer Pattern)就是一种 “发布者-订阅者” 的模式。有时也被称为“模型-视图”模式、“源-监听者”模式等。在这种模式中,由一个目标对象来管理所有依赖与它的观察者对象,并且当这个目标对象自身发生改变时,会主动向它的观察者们发出通知。
比如你最近在追一个美剧《生活大爆炸》,假设著名在线视频网站某狐买下独家版权,在线更新与播放。于是你天天等啊等啊,等它的更新通知一来,你就去看那些最新的视频。
// Subject 主题接口
public Subject {
virtual public void registerObserver(Observer o) = 0;
virtual public void removeObserver(Observer o) = 0;
virtual public void notifyAllObservers() = 0;
}
// 观察者接口
public Observer {
virtual public void update(Subject s) = 0;
}
// 视频网站某狐 实现 Subject 接口
public class VideoSite : Subject{
// 观察者列表 以及 更新了的视频列表
private QArrayList<Observer> userList;
private QArrayList<String> videos;
public VideoSite(){
userList = new QArrayList<Observer>();
videos = new QArrayList<QString>();
}
public void registerObserver(Observer o) {
userList.add(o);
}
public void removeObserver(Observer o) {
userList.remove(o);
}
public void notifyAllObservers() {
for (Observer o: userList) {
o.update(this);
}
}
public void addVideos(QString video) {
this.videos.add(video);
notifyAllObservers();
}
public QArrayList<QString> getVideos() {
return videos;
}
public QString toString(){
return videos.toString();
}
}
// 实现观察者,即看视频的美剧迷们
public class VideoFans : Observer {
private QString name;
public VideoFans(QString name){
this.name = name;
}
public void update(Subject s) {
qDebug() << this.name + ", new videos are available! ";
// print video list
qDebug() << s;
}
}
// 测试一下
void main(String[] args) {
VideoSite vs = new VideoSite();
vs.registerObserver(new VideoFans("LiLei"));
vs.registerObserver(new VideoFans("HanMeimei"));
vs.registerObserver(new VideoFans("XiaoMing"));
// add videos
vs.addVideos("Video 1");
//vs.addVideos("Video 2");
运行结果为:
前面已经说了,观察者模式也可以理解为 “源-监听者” 模式,这种应用就太多了。举个简单的例子就是各种 listener,比如当你有一个按键,你肯定要给这个按键添加监听事件(listener)来完成指定动作吧,这就是一种应用。