观察者模式学习--使用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可以用于做流量控制,特别是公用资源有限的应用场景.例 ...
随机推荐
- mysql和oracle的mybatis操作
1.Oracle.MySQL插入时返回下一个主键的操作 Oracle:<insert id="insert" parameterClass="ROLE"& ...
- 8051学习笔记——IIC与EEPROM实验
main.c #include <reg51.h> #include "iic.h" #define AT24C02 0xa0 //AT24C02 地址 sbit LS ...
- 【SSH 1】SSH框架的基本理解
导读:在结束了BS之后,接触到的第一个项目算是网上商城了.这次用到了和之前都不一样的框架:SSH.这个项目就和之前学牛腩一样,有着里程碑的意义.当然了,这也就意味着,什么都是新鲜的,接触到的东西,有时 ...
- HDOJ1010(BFS)
//为什么bfs不行呢,想不通 #include<cstdio>#include<cstring>#include<queue>using namespace st ...
- PAT1013. Battle Over Cities(邻接矩阵、邻接表分别dfs)
//采用不同的图存储结构结构邻接矩阵.邻接表分别dfs,我想我是寂寞了吧,应该试试并查集,看见可以用并查集的就用dfs,bfs代替......怕了并查集了 //邻接矩阵dfs #include< ...
- Linux:/bin/bash和/bin/sh的区别
bash.dash(/bin/bash和/bin/sh) 原文:http://www.cnblogs.com/dkblog/archive/2011/04/02/2003822.html Linux中 ...
- hdu1505
the main algorithm as the 1506 #include <stdio.h> #include <iostream> #include <strin ...
- js跟随鼠标移动的写法
<script> window.onload=function(){ document.onmousemove=function (ev) { var oEvent=ev||event; ...
- 五、Eclipse编写struts.xml没有提示的问题
五.Eclipse编写struts.xml没有提示的问题 原因:找不到约束文件 解决: 联网 手工配 a.eclipse的菜单:window\preferences
- [原]hdu2602 Bone Collector (01背包)
本文出自:http://blog.csdn.net/svitter 题意:典型到不能再典型的01背包.给了我一遍AC的快感. //=================================== ...