设计模式之观察者模式
来源:互联网 发布:linux vsftpd 安装 编辑:程序博客网 时间:2024/06/08 17:13
观察者模式
1 什么是观察者模式
一句话,观察者模式(Observer Pattern)就是一种 “发布者-订阅者” 的模式。有时也被称为 “模型-视图”模式、“源-监听者”模式等。在这种模式中, 由一个目标对象来管理所有依赖与它的观察者对象,并且当这个目标对象自身发生改变时,会主动向它的观察者们发出通知。
2 观察者模式类图
比如你最近在追一个美剧《生活大爆炸》,假设著名在线视频网站某狐买下独家版权,在线更新与播放。于是你天天等啊等啊,等它的更新通知一来,你就去看那些最新的视频。
3 观察者模式示例代码
// Subject 主题接口public interface Subject { public void registerObserver(Observer o); public void removeObserver(Observer o); public void notifyAllObservers();}// 观察者接口public interface Observer { public void update(Subject s);}// 视频网站某狐 实现 Subject 接口public class VideoSite implements Subject{ // 观察者列表 以及 更新了的视频列表 private ArrayList<Observer> userList; private ArrayList<String> videos; public VideoSite(){ userList = new ArrayList<Observer>(); videos = new ArrayList<String>(); } @Override public void registerObserver(Observer o) { userList.add(o); } @Override public void removeObserver(Observer o) { userList.remove(o); } @Override public void notifyAllObservers() { for (Observer o: userList) { o.update(this); } } public void addVideos(String video) { this.videos.add(video); notifyAllObservers(); } 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; } @Override public void update(Subject s) { System.out.println(this.name + ", new videos are available! "); // print video list System.out.println(s); }}// 测试一下public class Main { public static 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"); }}
运行结果为:
至于为什么打印出了[Video 1],我们来看类 VideoSite 中的 toString() 方法 返回的是 ArrayList 的 videos 对象,当 notifyAllObservers() 方法中调用 update()方法,传递 this 参数的时候,相当于传递了 videos 的值。
4 观察者模式的应用
前面已经说了,观察者模式也可以理解为 “源-监听者” 模式,这种应用就太多了。举个简单的例子就是各种 listener,比如当你有一个按键,你肯定要给这个按键添加监听事件(listener)来完成指定动作吧,这就是一种应用。
阅读全文
0 0
- 设计模式之-观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 设计模式之观察者模式
- 构造方法的总结
- 通达oa破解版|通达oa破解版下载|通达oa破解补丁
- numpy 数组和矩阵的乘法的理解
- Android Activity四种启动模式结论篇
- hdu6178-搜索&思维&读入挂-Monkeys
- 设计模式之观察者模式
- HDOJ3018 欧拉回路
- c#写文件时去除文件名包含的非法字符
- ztree实例(反选功能)
- python 2.x 和python 3.x 中的iteritems()和items()
- 突发奇想,把RecyclerView的Adapter封装了一下,留着自己用
- Stoer-Wagner无向图全局最小割(hduoj 3691 Nubulsa Expo)
- Web 端 js 导出csv文件(使用a标签)
- 玩转github