- 浏览: 213858 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
IXHONG:
registerBeanPostProcessors(bean ...
AbstractApplicationContext的refresh()方法简要说明 -
java_frog:
可以读汉字,但一行还是分开了。
FileChannel 读取中文文件解决乱码的一种方法 -
shenselongge:
引用
FileChannel 读取中文文件解决乱码的一种方法 -
string2020:
refresh到底是干啥的。@SpringBootApplic ...
AbstractApplicationContext的refresh()方法简要说明 -
dongpy1111:
最近使用String.format比较多。不晓得这个效率怎样。 ...
String vs StringBuffer vs StringBuilder
Observer模式定义对象间的一对多的依赖关系,当一个对象(被观察者)的状态发生改变时, 所有依赖于它的对象(观察者)都得到通知并被自动更新。JDK里提供的observer设计模式的实现由java.util.Observable类和 java.util.Observer接口组成。从名字上可以清楚的看出两者在Observer 设计模式中分别扮演的角色:Observer是观察者角色,Observable是被观察目标(subject)角色。
import java.util.Observer; import java.util.Vector; /** * Observable 被观察对象 * <p> * 一个 observable 对象可以有一个或多个观察者observer。 * <p> * 观察者是实现Observer接口的任意对象。 * <p> * 一个 observable 实例改变后,调用 Observable 的 notifyObservers 方法的应用程序会通过调用观察者的 update 方法来通知观察者该实例发生了改变。 * <P> */ public class Observable { /** 被观察对象是否改变 */ private boolean changed = false; /** * 一个 observable 对象可以有一个或多个观察者observer * <p> * 该集合是用来存放该被观察对象的观察对象 */ private final Vector obs; public Observable(){ obs = new Vector(); } /** * Adds an observer to the set of observers for this object, provided that it is not the same as some observer * already in the set. The order in which notifications will be delivered to multiple observers is not specified. * See the class comment. * <p> * 如果观察者与集合中已有的观察者不同, * <p> * 则向对象的观察者集中添加此观察者。 * <p> * 未指定向多个观察者发送通知的顺序。 * * @param o an observer to be added. * @throws NullPointerException if the parameter o is null. */ public synchronized void addObserver(Observer o) { if (o == null) throw new NullPointerException(); if (!obs.contains(o)) { obs.addElement(o); } } /** * Deletes an observer from the set of observers of this object. Passing <CODE>null</CODE> to this method will have * no effect. * <p> * 从对象的观察者集合中删除某个观察者。 * <p> * 向此方法传递 null无效 * * @param o the observer to be deleted. */ public synchronized void deleteObserver(Observer o) { obs.removeElement(o); } /** * If this object has changed, as indicated by the <code>hasChanged</code> method, then notify all of its observers * and then call the <code>clearChanged</code> method to indicate that this object has no longer changed. * <p> * Each observer has its <code>update</code> method called with two arguments: this observable object and * <code>null</code>. In other words, this method is equivalent to: <blockquote><tt> * notifyObservers(null)</tt></blockquote> * <p> * 如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。 * <p> * 每个观察者都有其 update 方法,其调用参数有两个:observable 对象和 null。换句话说,此方法等效于: notifyObservers(null) * * @see java.util.Observable#clearChanged() * @see java.util.Observable#hasChanged() * @see java.util.Observer#update(java.util.Observable, java.lang.Object) */ public void notifyObservers() { notifyObservers(null); } /** * If this object has changed, as indicated by the <code>hasChanged</code> method, then notify all of its observers * and then call the <code>clearChanged</code> method to indicate that this object has no longer changed. * <p> * Each observer has its <code>update</code> method called with two arguments: this observable object and the * <code>arg</code> argument. * <p> * 如果 hasChanged 方法指示对象已改变,则通知其所有观察者,并调用 clearChanged 方法来指示此对象不再改变。 * <p> * 每个观察者都有其 update 方法,其调用参数有两个:observable 对象和 arg 参数。 arg 可以是任意对象 * * @param arg any object. * @see java.util.Observable#clearChanged() * @see java.util.Observable#hasChanged() * @see java.util.Observer#update(java.util.Observable, java.lang.Object) */ public void notifyObservers(Object arg) { /* * 是当前观察者的快照 */ Object[] arrLocal; synchronized (this) { /* * 使用synchronized (this),可以避免在多线程的状况下新加的观察者和未被注册的观测者被通知 */ if (!changed) return; arrLocal = obs.toArray(); clearChanged(); } for (int i = arrLocal.length - 1; i >= 0; i--) ((Observer) arrLocal[i]).update(this, arg); } /** * Clears the observer list so that this object no longer has any observers. */ public synchronized void deleteObservers() { obs.removeAllElements(); } /** * Marks this <tt>Observable</tt> object as having been changed; the <tt>hasChanged</tt> method will now return * <p> * 标记此 Observable 对象为已改变的对象;现在 hasChanged 方法将返回 true。 * <p> * <tt>true</tt>. */ protected synchronized void setChanged() { changed = true; } /** * Indicates that this object has no longer changed, or that it has already notified all of its observers of its * most recent change, so that the <tt>hasChanged</tt> method will now return <tt>false</tt>. This method is called * automatically by the <code>notifyObservers</code> methods. * <p> * 指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以 hasChanged 方法将返回 false。 * <p> * notifyObservers 方法自动调用此方法。 * <p> * * @see java.util.Observable#notifyObservers() * @see java.util.Observable#notifyObservers(java.lang.Object) */ protected synchronized void clearChanged() { changed = false; } /** * Tests if this object has changed. * * @return <code>true</code> if and only if the <code>setChanged</code> method has been called more recently than * the <code>clearChanged</code> method on this object; <code>false</code> otherwise. * <p> * 测试对象是否改变。当且仅当在此对象上最近调用了 setChanged 方法时才返回 true;否则返回 false。 * @see java.util.Observable#clearChanged() * @see java.util.Observable#setChanged() */ public synchronized boolean hasChanged() { return changed; } /** * Returns the number of observers of this <tt>Observable</tt> object. * <p> * 返回 Observable 对象的观察者数目 * * @return the number of observers of this object. */ public synchronized int countObservers() { return obs.size(); } }
Oberver接口
这是个接口类,这个接口只有一个未实现的抽象方法update。实现该接口的对象成为观察者,该对象要实现update方法。注册了该对象(观察者)的对象(观察者)实例调用notifiyObservers方法后,观察者会自动执行update方法。
public interface Observer { /** * This method is called whenever the observed object is changed. An * application calls an <tt>Observable</tt> object's *只要改变了 observable 对象就调用此方法。 * <code>notifyObservers</code> method to have all the object's * observers notified of the change. * * @param o the observable object. * @param arg an argument passed to the <code>notifyObservers</code> * method. */ void update(Observable o, Object arg); }
发表评论
-
java的log框架全介绍
2013-11-22 17:00 34571.本篇不是什么? 不会告诉你应用系统为什么要引入日志框 ... -
Http的状态码及状态码的类型
2013-08-27 19:45 7730Http的状态码以及根据这些状态码分成5种类型 statu ... -
AbstractApplicationContext的refresh()方法简要说明
2013-04-03 00:20 10838public void refresh() throws B ... -
spring学习系列--what is the spring ioc container
2013-04-02 22:15 111.Combining ... -
javax.mail编写邮件的接受/转发/发送的指导文章
2013-02-03 17:20 939http://www.open-open.com/doc/vi ... -
ibatis+oracle批处理无法拿到影响的记录数
2012-10-26 19:27 1093Ibatis的SqlExecutor类里: publ ... -
ava.util.concurrent源码学习系列--volatile语义
2012-09-24 00:00 1074volatile语义:告诉处理器,不要到工作内存中找我,而是直 ... -
java.util.concurrent源码学习系列--Executor
2012-09-23 14:35 2990Executor的系列类图如下:这一些了类或接口都是和任务提交 ... -
获取spring的ApplicationContext的两种方法
2012-09-18 10:21 14441.第一种: ApplicationContext ap ... -
java.lang.class学习2--获取构造方法的过程,
2012-09-18 09:28 1060private Constructor<T ... -
改变线程上下文的类加载器ClassLoader
2012-09-17 17:30 1486/** * Override the thread ... -
学习文章(转)
2012-07-02 15:17 918http://kb.cnblogs.com/page/1216 ... -
最棒的网站
2012-03-14 20:52 999NO1:maven的中央仓库:http://search.ma ... -
java定时任务
2012-03-14 15:58 1657java的源码为我们提供了一些基础的实现:如Timer类和Ti ... -
用maven创建一个web工程,并用jetty启动
2012-03-14 12:38 88101.用mvn创建一个web应用。 mvn ... -
java事件模型
2012-03-13 22:17 2106事件源类:描述事件发生源的基本属性和行为。比如,按钮是很多事件 ... -
一段值得回味的代码
2012-03-07 19:26 924这个代码应该是每一个开源框架的ClassUtils都有的吧!本 ... -
Spring 3.1包详解
2012-03-06 17:45 989Spring 3.1包详解 Spring 3.1 ... -
spring的bean初始化
2012-03-06 10:31 3991spring为bean提供了两种初始化bean的方式,实现In ... -
ibatis的selectKey学习
2012-02-21 19:12 16104背景: 在使用ibatis插入数据进数据库的时候 ...
相关推荐
用java实现的观察者模式,共需要的人学习,如果有不对的地方也请指出
我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...
JDK里提供的observer设计模式的实现由java.util.Observable类和 java.util.Observer接口组成。从名字上可以清楚的看出两者在Observer 设计模式中分别扮演的角色:Observer是观察者角色,Observable是被观察目标...
观察者模式 Observer:Swing中的事件模型 工厂模式 Factory:在JDK中遍地都是,比如JDBC、JNDI等,是学习Spring的基础 命令模式 Command:Struts框架的基石 单例模式 Singleton:最简单的设计模式,大量...
本文给大家介绍使用java8实现观察者模式的方法,涉及到java8观察者模式相关知识,对此感兴趣的朋友一起学习吧
2.1观察者模式(不依赖jdk) 博文链接:https://biaowen.iteye.com/blog/505950
观察者模式 状态模式 策略模式 模板方法模式 访问者模式 设计案例 UML 架构 系统架构能力 基本理论 扩展性设计 可用性设计 可靠性设计 一致性设计 负载均衡设计 过载保护设计 协议设计 二进制协议...
能学到什么:①通过安装完成java之后,可以用其来学校对应的设计模式,比如:工厂模式、策略模式、观察者模式等. ②通过maven自主学习,还可以知道一些知识点都是怎么在Spring中体现的比如IOC、AOP、代理、切面、循环...
JDK 6+ Eclipse Indigo 和 Juno 报告问题 试验性功能 内部实现类 2. 开始学习 一分钟入门 安装Activiti 安装Activiti数据库 引入Activiti jar和依赖 下一步 3. 配置 创建ProcessEngine ...
在编程过程中,当我们想通知其他组件某些事情发生时,我们通常使用观察者模式,正式因为观察者模式非常常见,所以在jdk1.5中已经帮助我们实现了观察者模式,我们只需要简单的继承一些类就可以快速使用观察者模式,在...
目录 一、 JavaSE 部分 1、 Java 基础 ①Java 基础部分(基本语法, Java 特性等) ②关键字 ③面向对象 ④集合部分 2、 Java 高级知识 ①线程 ...②观察者模式 4、 所有模式汇总 十、 场景题 十一、 UML
观察者模式 中介者模式 2018.08.09 更新设计模式 结构型模式 适配器模式 桥接模式, 装饰模式, 外观模式, 享元模式, 代理模式。行为型模式的策略模式。 2018.08.08 更新设计模式 单例,工厂,建造者模式 2018.05....
高级java笔试题 JNotes 主要记录一下 JAVA 学习的一个心得,大部分内容都是自己归纳整理的 。个人认为这是一个 ...设计模式(15)观察者模式 设计模式(16)迭代器模式 设计模式(17)责任链模式 设计模
基于一种可能失效的观察结果来做出判断或执行某个计算 复合操作:执行复合操作期间,要持有锁 锁的作用 加锁机制、用锁保护状态、实现共享访问 锁的不恰当使用可能会引起程序性能下降 对象的...
该文档为官方webx框架文档,对webx进行了全面的讲解,非常实用,并附学习的Demo 为什么要用Webx而不是其它的开源框架? 现在有很多Java的Web框架可供选择,并且它们也都是免费的。例如: • Struts • Webwork • ...
本资源为大数据基础到中高级教学资源,适合稍微有点大数据或者java基础的人群学习,资源过大,上传乃是下载链接,不多说,上目录: 1_java基础2 l3 a2 a$ t7 J2 b+ `- p 2_java引入ide-eclipse 3_java基础知识-循环...