观察者模式
2016-04-15 19:54
281 查看
定义:观察者模式定义了对象之间的一对多的依赖,当一个对象改变状态时,其他的依赖者都会收到通知。
定义中的“一”指的是“主题对象”,“多”指的是“观察者”,通俗的说就是当主题对象中状态(数据,信息等)改变了,就会通知观察者主题改变了状态,接下来观察者就可以更新信息了。
请看观察者模式的类图
现在互联网非常发达,手机上下载个新闻类的app就可以随时阅读新闻,获取最新的咨询。但是在以前,我们看新闻是从报纸上获取的,我们只要向出版社订阅报纸,每天就会收到报纸。
这里出版社就是“主题”,订阅报纸的人就是“观察者”(订阅报纸的人可以很多),只要出版社出了新报纸,就会主动的给订阅的人送去。我们也可以取消订阅,取消以后就不会收到出版社的报纸了。
首先,开始主题接口和观察者接口。
接下来是出版社实现类
观察者实现类
上述代码可以看出,主题出版社负责产出新闻,维护它的所有使用者,将产出的新闻,通知给使用者,使用者获得新闻后,怎么处理就由使用者决定,与主题没有关系。
测试代码
测试结果
好了,恭喜你又掌握了一个设计模式,以后就可以大展身手了。
定义中的“一”指的是“主题对象”,“多”指的是“观察者”,通俗的说就是当主题对象中状态(数据,信息等)改变了,就会通知观察者主题改变了状态,接下来观察者就可以更新信息了。
请看观察者模式的类图
现在互联网非常发达,手机上下载个新闻类的app就可以随时阅读新闻,获取最新的咨询。但是在以前,我们看新闻是从报纸上获取的,我们只要向出版社订阅报纸,每天就会收到报纸。
这里出版社就是“主题”,订阅报纸的人就是“观察者”(订阅报纸的人可以很多),只要出版社出了新报纸,就会主动的给订阅的人送去。我们也可以取消订阅,取消以后就不会收到出版社的报纸了。
首先,开始主题接口和观察者接口。
package com.zengfeng.observer; //主题接口 public interface Subject { //注册观察者 public void registerObserver(Observer o); //移除观察者 public void removeObserver(Observer o); //通知观察者 public void notifyObservers(); }
package com.zengfeng.observer; //观察者接口 public interface Observer { //更新新闻 public void update(New news); }
package com.zengfeng.observer; //新闻类 public class New { //标题 private String title; //内容 private String content; //作者 private String autor; public New(String title,String content,String autor) { this.title=title; this.content=content; this.autor=autor; } @Override public String toString() { return "New [\n title=" + title + ",\n content=" + content + ", \n autor=" + autor + "]"; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getAutor() { return autor; } public void setAutor(String autor) { this.autor = autor; } }
接下来是出版社实现类
package com.zengfeng.observer; import java.util.ArrayList; //出版社主题 public class PressSubject implements Subject{ //观察者,实现一对多 private ArrayList<Observer> observers; private New news; public PressSubject() { observers=new ArrayList<>(); } //注册观察者 @Override public void registerObserver(Observer o) { observers.add(o); } //删除观察者 @Override public void removeObserver(Observer o) { int i=observers.indexOf(o); if(i>=0) observers.remove(i); } //通知观察者 @Override public void notifyObservers() { for(Observer observer:observers){ observer.update(news); } } //当新闻更新时,通知观察者 public void NewsChange(New news){ this.news=news; notifyObservers(); } }
观察者实现类
package com.zengfeng.observer; //观察者一 public class OneObserver implements Observer{ //主题 private Subject subject; public OneObserver(Subject subject) { this.subject=subject; subject.registerObserver(this); } //更新方式 public void update(New news) { public void update(New news) { System.out.println("观察者OneObserver,接收新闻:"+news+" ,我喜欢看这条新闻。"); } ; } }
package com.zengfeng.observer; //观察者二 public class TwoObserver implements Observer{ //主题 private Subject subject; public TwoObserver(Subject subject) { this.subject=subject; subject.registerObserver(this); } //更新方式 public void update(New news) { System.out.println("观察者TwoObserver,接收新闻:"+news+" ,这条新闻有点有趣。"); } }
上述代码可以看出,主题出版社负责产出新闻,维护它的所有使用者,将产出的新闻,通知给使用者,使用者获得新闻后,怎么处理就由使用者决定,与主题没有关系。
测试代码
package com.zengfeng.observer; public class ObserverTest { public static void main(String[] args) { //主题 PressSubject press=new PressSubject(); //观察者 Observer oneObserver=new OneObserver(press); Observer twoObserver=new TwoObserver(press); press.NewsChange(new New("习近平:不断提高人民群众安全感幸福感", "在4月15日首个全民国家安全教育日到来之际........","新华社北京4月14日电")); System.out.println("-----------------------------------------"); press.NewsChange(new New("颜值爆表会撒娇 中科大发布首款交互美女机器人", "4月15日上午,中科大正式发布我国首台特有体验交互机器人“佳佳”......","未知")); } }
测试结果
好了,恭喜你又掌握了一个设计模式,以后就可以大展身手了。
相关文章推荐
- Tell me the area---hdu1798 (数学 几何)
- char[],char *,string之间转换
- 用Jersey为Android客户端开发Restful Web Service
- 计算机程序的思维逻辑 (1) - 数据和变量
- 89. Gray Code
- POJ 3373 Changing Digits
- Leetcode Self Crossing
- 初学android开发--day07
- HDU-1010-Tempter of the Bone(搜索奇偶剪枝)
- 第五次Java作业
- JAVA第五次作业
- python与c互相调用
- 使用Nexus创建Maven私有仓库
- centos6环境创建局域网http方式的yum源
- nefu500(二分,最大流)
- RStudio快捷键
- poj 3233(矩阵快速幂+二分)
- centos6环境创建局域网http方式的yum源
- 详细解析BluetoothAdapter的详细api
- 怎么用oracle数据泵导数据