观察者模式

标签:java设计模式—–实验楼
标签(空格分隔): 未分类


Java设计模式–观察者模式

什么是观察者模式(Observer Pattern)

观察者模式就是一种“发布者-订阅模式”。在这种,模式中,由一个目标对象来管理所有依赖于它的观察者对象,并且当这个目标对象自身发生改变的时候,会主动向它的观察者们发出通知。

观察者模式实例代码

情景:很多的同学都是某些剧的粉丝,于是有了追剧这一动作。但是你不可能每天都打开看一下吧,这样多麻烦,于是网站推出了新功能,你可以选择注册网站,然后订阅该视频。于是该网站的视频有更新,就会提醒你,这就是典型的“发布者-订阅者模式”,网站是发布者的角色而粉丝就是订阅者。

//首先网站要设置这样的功能,你得先订阅该视频。有订阅就有取消订阅。同时还要进行通知。因此将这几个动作封装一下。(不仅这个网站这样,其他网站也可以来实现这个接口,减少重复)
public interface Subject {
    public void registerObserver(Observer o);

    public void removeObserver(Observer o);

    public void notifyAllObserver();
}
//观察到,这个接口中包含了另一个类Oberver,所有的粉丝都是观察者,于是写一个观察者接口,由粉丝实现
public interface Observer {
    public void update(Subject s);
}
//网站实现Subject接口,可以看到,这个网站有很多的粉丝(观察者)和很多的视频,更新的视频要放在列表中去,新增的粉丝(观察者)要添加列表中去,(把观察者放在一个集合中方便我们通知)
public class VideoSite implements Subject {
    private ArrayList<Observer> userList;
    private ArrayList<String> videos;

    public VideoSite() {
        // TODO Auto-generated constructor stub
        userList = new ArrayList<Observer>();
        videos = new ArrayList<String>();
    }

    @Override
    public void notifyAllObserver() {
        // TODO Auto-generated method stub
        for (Observer o : userList) {
            o.update(this);
        }

    }

    @Override
    public void registerObserver(Observer o) {
        // TODO Auto-generated method stub
        userList.add(o);

    }

    @Override
    public void removeObserver(Observer o) {
        // TODO Auto-generated method stub
        userList.remove(o);

    }

    public void addVideos(String video) {
        this.videos.add(video);
        notifyAllObserver();
    }

    public ArrayList<String> getVideos() {
        return videos;
    }

    public String toString() {
        return videos.toString();
    }

}

//粉丝类,所有的粉丝都是观察者身份,实现观察者的接口
public class VideoFans implements Observer {
    private String name;

    public VideoFans(String name) {
        this.name = name;
        // TODO Auto-generated constructor stub
    }

    @Override
    public void update(Subject s) {
        // TODO Auto-generated method stub
        System.out.println(this.name + ",new videos are available");
        System.out.println("subject:"+s);

    }

}
//测试一下
public class Main {
    public static void main(String[] args) {
        VideoSite vs = new VideoSite();
        vs.registerObserver(new VideoFans("Lilei"));//将粉丝Lilei注册为一个网站观察者(订阅者)
        vs.registerObserver(new VideoFans("HanMeimei"));
        vs.registerObserver(new VideoFans("XiaoMing"));
        vs.addVideos("Video 1");//网站视频内容更新
    }
}

//测试程序的执行过程:以Lilei为例,网站先将Lilei注册为观察者,因此Lilei就可以获得通知了。好,后面我们给网站新增了视频 “Video 1”。于是视频列表更新了,在addVideos()方法中我们设定了通知观察者的方法notifyAllObserver(),然后执行该方法,发现该方法是对观察者列表遍历并同时执行update()方法,这个update是观察后者接口定义的,在VideoFans类中被实现。执行updata()方法中的打印语句,打完收工。

观察者模式的应用

简直就是各种listen,给按键添加监听事件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值