观察者模式
来源:互联网 发布:牛股宝手机炒股软件 编辑:程序博客网 时间:2024/05/16 09:55
一、观察者模式(Observer Pattern)的定义
1、观察者模式:发布者-订阅者模式、模型-视图模式、源-监听者模式
2、在观察者模式中,由一个目标对象来管理所有依赖于他的观察者对象,并且当这个目标对象自身发生改变时,会主动向它的观察者们发出通知。
二、观察者模式类图
例如 你最近在追《生活大爆炸》,假设某个视频网站买下独家版权,在线更新与播放。于是当你等到它的更新通知时你就去看那些最新的视频。
三、示例代码
// 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");
}
}
输出结果:
LiLei,new videos are available!
[Video 1]
HanMeimei,new videos are available!
[Video 1]
XiaoMing,new videos are available!
[Video 1]
为什么打印出了[Video 1]?
类 VideoSite 中的 toString() 方法 返回的是 ArrayList 的 videos 对象,当notifyAllObservers() 方法中调用 update()方法,传递 this 参数的时候,相当于传递了 videos 的值。
参考:
http://www.cnblogs.com/zhangjs8385/archive/2011/10/10/2205281.html
https://www.shiyanlou.com/courses/running#
阅读全文
0 0
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- Oracle中的数据字典
- hdu5493(线段树,离线操作,点修改,区间查询)
- nova compute服务如何部署一个instance
- 进程间的通信之共享内存
- C# 中方法、类的默认修饰符
- 观察者模式
- ansible apt 模块
- 来到csdn博客的第一天
- 规范使用C++内联函数
- PAT乙级 1017. A除以B (20)--模拟大数除法
- unity3d配置Android环境,打包发布Apk流程详解
- EMD代码的研究之路
- 嵌入式linux基础学习全套精品视频教程
- Linux:GDB调试NS2项目详细步骤