JDK自带观察者的使用
被观察者
package observerForJDK;import java.util.Observable;/*** 新闻派发器,当有新的新闻时派发给所有的订阅读者(观察者)*/ public class NewsDispatcher extends Observable {public void addNews(String news){this.setChanged();this.notifyObservers(news);} }
观察者:
package observerForJDK;import java.util.Observable; import java.util.Observer;/*** 读者(观察者)*/ public class Reader implements Observer {private String name;public Reader(String name) {this.name = name;}public void update(Observable o, Object arg) {String news = (String)arg;System.out.println(name + "观察到 : " + news);} }
测试:
package observerForJDK;/*** 测试类*/ public class app {public static void main(String[] args) {//体育新闻派发器NewsDispatcher sportNewsDispatcher = new NewsDispatcher();//it新闻派发器NewsDispatcher itNewsDispatcher = new NewsDispatcher();//观察者r1,r2,r3Reader r1 = new Reader("r1");Reader r2 = new Reader("r2");Reader r3 = new Reader("r3");//添加观察者 sportNewsDispatcher.addObserver(r1);sportNewsDispatcher.addObserver(r2);itNewsDispatcher.addObserver(r3);//当有新的新闻的时候,通知观察者sportNewsDispatcher.addNews("中国队突破了历史获得了世界杯冠军!");itNewsDispatcher.addNews("ibm 收购 sun公司,java开始收费!");} }
但这种写法有点问题,观察者需要手动一个一个add进去,太麻烦
改进下:被观察者不变
观察者:
package observerForJDK;import java.util.Observable; import java.util.Observer;/*** 读者(观察者)*/ public class Reader2 implements Observer {private String name;private Observable observable;public Reader2(Observable observable,String name) {this.observable = observable;this.observable.addObserver(this);this.name = name;}public void update(Observable o, Object arg) {String news = (String)arg;System.out.println(name + "观察到 : " + news);} }
测试类:
package observerForJDK;/****/ public class app2 {public static void main(String[] args) {//体育新闻派发器NewsDispatcher sportNewsDispatcher = new NewsDispatcher();//it新闻派发器NewsDispatcher itNewsDispatcher = new NewsDispatcher();//观察者r1,r2,r3Reader2 r1 = new Reader2(sportNewsDispatcher,"r1");Reader2 r2 = new Reader2(sportNewsDispatcher,"r2");Reader2 r3 = new Reader2(itNewsDispatcher,"r3");//当有新的新闻的时候,通知观察者sportNewsDispatcher.addNews("中国队突破了历史获得了世界杯冠军!");itNewsDispatcher.addNews("ibm 收购 sun公司,java开始收费!");} }
更实用点的例子:小说网站作者和读者之间的订阅
//读者类,要实现观察者接口 public class Reader implements Observer{private String name;public Reader(String name) {super();this.name = name;}public String getName() {return name;}//读者可以关注某一位作者,关注则代表把自己加到作者的观察者列表里public void subscribe(String writerName){WriterManager.getInstance().getWriter(writerName).addObserver(this);}//读者可以取消关注某一位作者,取消关注则代表把自己从作者的观察者列表里删除public void unsubscribe(String writerName){WriterManager.getInstance().getWriter(writerName).deleteObserver(this);}//当关注的作者发表新小说时,会通知读者去看public void update(Observable o, Object obj) {if (o instanceof Writer) {Writer writer = (Writer) o;System.out.println(name+"知道" + writer.getName() + "发布了新书《" + writer.getLastNovel() + "》,非要去看!");}}}
作者类:
//作者类,要继承自被观察者类 public class Writer extends Observable{private String name;//作者的名称private String lastNovel;//记录作者最新发布的小说public Writer(String name) {super();this.name = name;WriterManager.getInstance().add(this);}//作者发布新小说了,要通知所有关注自己的读者public void addNovel(String novel) {System.out.println(name + "发布了新书《" + novel + "》!");lastNovel = novel;setChanged();notifyObservers();}public String getLastNovel() {return lastNovel;}public String getName() {return name;}}
然后我们还需要一个管理器帮我们管理这些作者。如下。
import java.util.HashMap; import java.util.Map;//管理器,保持一份独有的作者列表 public class WriterManager{private Map<String, Writer> writerMap = new HashMap<String, Writer>();//添加作者public void add(Writer writer){writerMap.put(writer.getName(), writer);}//根据作者姓名获取作者public Writer getWriter(String name){return writerMap.get(name);}//单例private WriterManager(){}public static WriterManager getInstance(){return WriterManagerInstance.instance;}private static class WriterManagerInstance{private static WriterManager instance = new WriterManager();} }
好了,这下我们的观察者模式就做好了,这个简单的DEMO可以支持读者关注作者,当作者发布新书时,读者会观察到这个事情,会产生相应的动作。下面我们写个客户端调用一下。
//客户端调用 public class Client {public static void main(String[] args) {//假设四个读者,两个作者Reader r1 = new Reader("谢广坤");Reader r2 = new Reader("赵四");Reader r3 = new Reader("七哥");Reader r4 = new Reader("刘能");Writer w1 = new Writer("谢大脚");Writer w2 = new Writer("王小蒙");//四人关注了谢大脚r1.subscribe("谢大脚");r2.subscribe("谢大脚");r3.subscribe("谢大脚");r4.subscribe("谢大脚");//七哥和刘能还关注了王小蒙r3.subscribe("王小蒙");r4.subscribe("王小蒙");//作者发布新书就会通知关注的读者//谢大脚写了设计模式w1.addNovel("设计模式");//王小蒙写了JAVA编程思想w2.addNovel("JAVA编程思想");//谢广坤取消关注谢大脚r1.unsubscribe("谢大脚");//谢大脚再写书将不会通知谢广坤w1.addNovel("观察者模式");}}
参考:http://blog.csdn.net/zuoxiaolong8810/article/details/9081079
JDK自带观察者的使用相关推荐
- 别再面向 for 循环编程了,JDK 自带的观察者模式就很香!
大家好,你还在面向 for 循环编程吗? 还有谁不会用观察者模式吗? 本篇带来<观察者模式>理论及实战- 什么是观察者模式? 观察者模式(Observer Pattern)定义了对象间的一 ...
- jdk自带压测工具_FULL GC分析过程分享
http://www.taobaotest.com/blogs/2294 在性能测试过程中,FULL GC频繁是比较常见的问题,FULL GC 产生的原因有很多,这里主要针对meta压测过程中分析FU ...
- jdk自带的反编译在那个包下_求教JDK中的反编译命令
展开全部 用习惯了著名的反编32313133353236313431303231363533e78988e69d8331333361326265译工具jad的话,如果有的时候单给出class文件,要快 ...
- VisualVM——JDK自带的性能分析工具
引子 这段时间项目新版本要发了,所以跟着QA分析性能测试和压力测试,用了平时不怎么用的很多工具: jmap jmap -heap pid → 查看堆的使用状况信息 jmap -histo:live ...
- 使用jdk 自带的jarsigner 签名工具签名的apk 和android规范有区别
jdk 自带的签名工具签名后的 apk : ebuy 是签名文件的 Alias名称. android sdk 签名和jdk 签名之后的apk 对比: android sdk 签名: jdk jarsi ...
- 使用JDK自带的jmap和jhat监控处于运行状态的Java进程
对于处于运行状态中的Java进程,JDK自带了很多工具,允许Java开发人员监控运行进程中的各种状态,比如该进程内部创建了多少个对象实例,消耗了多少内存,等等. 本文基于JDK1.8而写成. 我下面写 ...
- 使用JDK自带的VisualVM进行Java程序的性能分析
VisualVM是什么? VisualVM是JDK自带的一个用于Java程序性能分析的工具,JDK安装完毕后就有啦,在JDK安装目录的bin文件夹下能找到名称为jvisualvm.exe. 要使用Vi ...
- jdk自带常用命令行工具使用
转自:http://blog.csdn.net/winwill2012/article/details/46364923 jps命令使用 jps命令类似于Linux下的ps命令,用于列出当前正在运行的 ...
- 使用了JDK自带的jconsole查看Tomcat运行情况
最近对公司的项目进行JVM调优,使用了JDK自带的jconsole查看Tomcat运行情况,记录下配置以便以后参考: 首先,修改Tomcat的bin目录下的catalina.bat文件,在JAVA_O ...
- 利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 Jtop
利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 原文链接 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能 ...
最新文章
- 洛谷P3953 逛公园(dp 拓扑排序)
- 给缺少Python项目实战经验的人
- mysql怎么查看刷脏页慢_一条SQL查询语句极为缓慢,如何去优化呢
- Bootstrap 列平移/列偏移
- Integer你真的了解吗,快来瞅瞅吧
- Android中使用FragmentManager获得控件
- outlook qr码在哪里_胡志明市第一次将QR码附加在街道名称板上,目的是什么?
- Linux chmod、fchmod函数
- 杭电 1142 十字链表存储
- linux下绿联USB转网卡驱动安装
- 【GLSL教程】(七)逐像素的光照
- esim分布式云卡池技术
- 石英晶振的发展趋势及应用
- 泡泡一分钟:BLVD: Building A Large-scale 5D Semantics Benchmark for Autonomous Driving
- 单枪匹马想要搞定亿级流量?2021阿里都换成这个牛逼架构了
- linux中grep命令详解及使用示例
- 谷歌浏览器有些图片不显示
- SpringCloud系列(2)---Netfilx-Eureka
- 功率MOS管驱动设计与PCB layout注意事项
- 分布式存储基础之kad
热门文章
- HDU 4609 3-idiots (FFT)
- 邮箱服务器端口以及各大型邮箱smtp服务器及端口收集
- Dot net GC
- 【Robot Framework】字符串判断,if语句多执行条件,多执行语句
- 【转】局部变量和全局变量---------------【答不对,你还敢说你精通、熟悉python?】...
- .net 平台下的File.Exists和directory .Exists()
- yii2.0 读取user表新增字段问题
- 一个嵌入Flash的Gadget小程序
- 微软删除了人脸识别库,除了因为隐私,更重要的恐怕是因为性别歧视和种族主义...
- 计算机网络领悟摩尔定,计算机网络等133信息技术展望P15-P17.PPT