观察者模式

观察者模式(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)来完成指定动作吧,这就是一种应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值