被观察者

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自带观察者的使用相关推荐

  1. 别再面向 for 循环编程了,JDK 自带的观察者模式就很香!

    大家好,你还在面向 for 循环编程吗? 还有谁不会用观察者模式吗? 本篇带来<观察者模式>理论及实战- 什么是观察者模式? 观察者模式(Observer Pattern)定义了对象间的一 ...

  2. jdk自带压测工具_FULL GC分析过程分享

    http://www.taobaotest.com/blogs/2294 在性能测试过程中,FULL GC频繁是比较常见的问题,FULL GC 产生的原因有很多,这里主要针对meta压测过程中分析FU ...

  3. jdk自带的反编译在那个包下_求教JDK中的反编译命令

    展开全部 用习惯了著名的反编32313133353236313431303231363533e78988e69d8331333361326265译工具jad的话,如果有的时候单给出class文件,要快 ...

  4. VisualVM——JDK自带的性能分析工具

    引子 这段时间项目新版本要发了,所以跟着QA分析性能测试和压力测试,用了平时不怎么用的很多工具: jmap jmap -heap pid → 查看堆的使用状况信息  jmap -histo:live ...

  5. 使用jdk 自带的jarsigner 签名工具签名的apk 和android规范有区别

    jdk 自带的签名工具签名后的 apk : ebuy 是签名文件的 Alias名称. android sdk 签名和jdk 签名之后的apk 对比: android sdk 签名: jdk jarsi ...

  6. 使用JDK自带的jmap和jhat监控处于运行状态的Java进程

    对于处于运行状态中的Java进程,JDK自带了很多工具,允许Java开发人员监控运行进程中的各种状态,比如该进程内部创建了多少个对象实例,消耗了多少内存,等等. 本文基于JDK1.8而写成. 我下面写 ...

  7. 使用JDK自带的VisualVM进行Java程序的性能分析

    VisualVM是什么? VisualVM是JDK自带的一个用于Java程序性能分析的工具,JDK安装完毕后就有啦,在JDK安装目录的bin文件夹下能找到名称为jvisualvm.exe. 要使用Vi ...

  8. jdk自带常用命令行工具使用

    转自:http://blog.csdn.net/winwill2012/article/details/46364923 jps命令使用 jps命令类似于Linux下的ps命令,用于列出当前正在运行的 ...

  9. 使用了JDK自带的jconsole查看Tomcat运行情况

    最近对公司的项目进行JVM调优,使用了JDK自带的jconsole查看Tomcat运行情况,记录下配置以便以后参考: 首先,修改Tomcat的bin目录下的catalina.bat文件,在JAVA_O ...

  10. 利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 Jtop

    利用jdk自带的运行监控工具JConsole观察分析Java程序的运行 原文链接 一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能 ...

最新文章

  1. 洛谷P3953 逛公园(dp 拓扑排序)
  2. 给缺少Python项目实战经验的人
  3. mysql怎么查看刷脏页慢_一条SQL查询语句极为缓慢,如何去优化呢
  4. Bootstrap 列平移/列偏移
  5. Integer你真的了解吗,快来瞅瞅吧
  6. Android中使用FragmentManager获得控件
  7. outlook qr码在哪里_胡志明市第一次将QR码附加在街道名称板上,目的是什么?
  8. Linux chmod、fchmod函数
  9. 杭电 1142 十字链表存储
  10. linux下绿联USB转网卡驱动安装
  11. 【GLSL教程】(七)逐像素的光照
  12. esim分布式云卡池技术
  13. 石英晶振的发展趋势及应用
  14. 泡泡一分钟:BLVD: Building A Large-scale 5D Semantics Benchmark for Autonomous Driving
  15. 单枪匹马想要搞定亿级流量?2021阿里都换成这个牛逼架构了
  16. linux中grep命令详解及使用示例
  17. 谷歌浏览器有些图片不显示
  18. SpringCloud系列(2)---Netfilx-Eureka
  19. 功率MOS管驱动设计与PCB layout注意事项
  20. 分布式存储基础之kad

热门文章

  1. HDU 4609 3-idiots (FFT)
  2. 邮箱服务器端口以及各大型邮箱smtp服务器及端口收集
  3. Dot net GC
  4. 【Robot Framework】字符串判断,if语句多执行条件,多执行语句
  5. 【转】局部变量和全局变量---------------【答不对,你还敢说你精通、熟悉python?】...
  6. .net 平台下的File.Exists和directory .Exists()
  7. yii2.0 读取user表新增字段问题
  8. 一个嵌入Flash的Gadget小程序
  9. 微软删除了人脸识别库,除了因为隐私,更重要的恐怕是因为性别歧视和种族主义...
  10. 计算机网络领悟摩尔定,计算机网络等133信息技术展望P15-P17.PPT