标签: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,给按键添加监听事件