观察者模式学习--使用jdk的工具类简单实现
观察者模式学习之二:使用jdk的自带的工具类实现,与自己实现相比,两者有以下的区别:
1,自己实现,需要定义观察者的接口类和目标对象的接口类。使用java util的工具类,则不需要自己定义观察者和目标对象的接口类了,jdk已经定义好了。
2,自己实现,具体的目标对象类中,实现了接口方法后,还必须要自己实现维护观察者的注册删除信息。但是使用jdk,则不需要了,在
jdk的util下的observable类里面已经帮忙维护好了。
3,目标对象触发观察者的update的通知方式有了变化,自己的实现,只要定义好触发方法,调用观察者的接口的update方法就好了。使用jdk则必须要先先调用setChange()方法,否则,不会触发通知,通知观察者变化。这是java为了帮助实现更加精准的触发控制而提供的功能方法。
4,具体的观察者类的实现中,update方法有区别,自己实现的,需要按照自己的需要定义好是按照推模式,还是拉模式,定义update的方法参数。但是 使用jdk,则update的方法中包含了传送的参数和目标对象的引用。能够同时满足推模式和拉模式的实现。
下面具体的代码实现:
首先是具体的目标对象的实现类,其中包含了部分的自己的测试代码:
public class MySubject extends Observable {
// 目标的内容
private String sujectContent;
public String getSujectContent() {
return sujectContent;
}
public void setSujectContent(String sujectContent) {
this.sujectContent = sujectContent;
// 是用jdk 必须要先调用此方法。
setChanged();
// 通知观察则变化 拉模式
// notifyObservers();
// 通知观察则变化 推模式
notifyObservers(sujectContent);
}
}
然后,用jdk,实现具体的观察者实现类:同样包含了部分的测试代码:其中注明了 推模式 和 拉模式的分别的实现方式。
public class MyObserver implements Observer {
private String observerName;
@Override
public void update(Observable o, Object arg) {
MySubject subject = (MySubject) o;
System.out.println(observerName + "收到了目标变化,拉模式,获取变化的内容"
+ subject.getSujectContent());
System.out.println(observerName + "收到了目标变化,推模式,获取变化的内容" + arg);
}
public String getObserverName() {
return observerName;
}
public void setObserverName(String observerName) {
this.observerName = observerName;
}
}
最后写下,简单的测试类:测试结果的正确性:创建两个观察者,分别在目标对象中注册,目标对象发生变化,通知两个观察者实时更新。
/**
* @author lilin
*
*/
public class ObserverTest { /**
* @param args
*/
public static void main(String[] args) {
MySubject subject = new MySubject();
MyObserver observer = new MyObserver();
observer.setObserverName("观察者1"); MyObserver observer2 = new MyObserver();
observer2.setObserverName("观察者2");
// 注册观察者
subject.addObserver(observer);
subject.addObserver(observer2);
// 目标发生变化,通知观察者更新
subject.setSujectContent("天气转阴!");
} }
测试结果如下展示:
观察者2收到了目标变化,拉模式,获取变化的内容天气转阴!
观察者2收到了目标变化,推模式,获取变化的内容天气转阴!
观察者1收到了目标变化,拉模式,获取变化的内容天气转阴!
观察者1收到了目标变化,推模式,获取变化的内容天气转阴!
观察者模式学习--使用jdk的工具类简单实现的更多相关文章
- 并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理
在jdk中,为并发编程提供了CyclicBarrier(栅栏),CountDownLatch(闭锁),Semaphore(信号量),Exchanger(数据交换)等工具类,我们在前面的学习中已经学习并 ...
- Java学习笔记43(打印流、IO流工具类简单介绍)
打印流: 有两个类:PrintStream,PrintWriter类,两个类的方法一致,区别在于构造器 PrintStream:构造方法:接收File类型,接收字符串文件名,接收字节输出流(Outpu ...
- JDK中工具类的使用
JDK中内置了很多常用的工具类,且多以“s”结尾,如:集合工具类Collections,数组工具类Arrays,对象工具类Objects,文件工具类Files,路径工具类Paths,数学工具类Math ...
- JDK并发工具类
在JDK的并发包里提供了几个非常有用的并发工具类.CountDownLatch.CyclicBarrier和Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线程 ...
- Apache Commons 工具类简单使用
Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于 ...
- Java学习笔记七——数组工具类Arrays
数组工具类Arrays Java提供的Arrays类里包含的一些static修饰的方法可以直接操作数组.若将里面的方法用熟的话,那开发效率会大大提高.下面介绍其中的方法. List<T> ...
- [Guava学习笔记]Collections: 集合工具类
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3861431.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- java学习-加载.properties工具类
javaWeb项目,要加载xxx.properties或其它如.txt, .md后缀的文本文件 文本内容有两种格式 key:value或者key=value 诸如Spring框架,Jfinal框架,都 ...
- Java并发之Semaphore和Exchanger工具类简单介绍
一.Semaphore介绍 Semaphore意思为信号量,是用来控制同时访问特定资源的线程数数量.它的本质上其实也是一个共享锁.Semaphore可以用于做流量控制,特别是公用资源有限的应用场景.例 ...
随机推荐
- Android开发-API指南-<instrumentation >
<instrumentation> 英文原文:http://developer.android.com/guide/topics/manifest/instrumentation-elem ...
- asp.net 播放flash
注意3点: 1.路径,swf播放器对应的是当前页面的路径,flv视频对应的是swf播放器的路径2.路径中不能出现中文3.IIS设置,IIS站点属性中的HTTP头->MIME添加MIME影射关系, ...
- oracle删除用户及其名下对象
drop user XXXX cascade; drop tablespace XXXX INCLUDING CONTENTS;
- 学习练习 java产生6个不同的数字
public static void main(String[] args) { Random r=new Random(); int arr[]=new int[6]; for(int i=0;i& ...
- MVC中使用过滤器记录异常日志
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Filte ...
- 【Hibernate 6】常用的hql语句以及N+1问题
HQL:Hibernate Query Language,是Hibernate框架中的查询语言,十分接近于SQL语言!以下介绍一些常用的Hql语句: 一.测试类 Classes类: <span ...
- 2016-03-10:libx265源码解析
单步跟踪执行流程 将cli设定为启动项目,在属性->调试->命令行参数中设置如下参数: --input E:\video\pedestrian_area.yuv --fps 24 --in ...
- ax 的错误处理范例
#OCCRetryCount ; try { ttsbegin; //example as insert or update or delete record ttscommit; } catch(E ...
- WWF3的持续化<第五篇>
WWF提供的持续化功能会自动记录工作流实例以及它包含的所有活动的执行状态,这些状态并不是指工作流上流转的表单所呈现的业务逻辑状态.WWF持续化功能就是将未执行完成的工作流实例以及该实例中各种活动的状态 ...
- Loadrunner:安装LR11.0破解步骤及License
破解步骤: 1.关闭LR相关程序 2.运行LicenseDelete程序,清除LR原来的License 3.将lm70.dll和mlr5lprg.dll这两个文件复制并粘贴到LR安装目录下的bin文件 ...