从某种角度来说,我们总是处于两种生活状态:观察者与被观察者。当处于观察者状态时,被观察的对象会向我们发出某种信息,使我们产生某种心理活动或行为状态的改变。当我们处于被观察者状态时,我们的行为活动又可以以信息的方式影响观察者。(大多数情况下是两种状态并存。)
作为一种面向对象的编程语言,java中的设计模式跟我们的生活模式十分相似,观察者模式也不例外。
一 观察者模式定义与组成
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己 。主要分为四部分:1.抽象主题角色 2.抽象观察者角色 3.具体主题角色 4.具体观察者角色
二 自定义观察者模式
/**抽象主题角色:
* 把所有对观察者对象的引用保存在一个集合中,
* 每个抽象主题角色都可以有任意数量的观察者。
* 抽象主题提供一个接口,可以增加和删除观察者角色。
* 一般用一个抽象类或接口来实现
*/
public interface BeWatched {
//增加一个观察者
public void addWatcher(Watcher watcher);
//删除一个观察者
public void removeWatcher(Watcher watcher);
//通知所有的观察者
public void notifyWatchers(String str);
}
/**
* 抽象观察者角色:为所有观察者定义一个接口,在接到主题角色的通知时更新自己
* @author Administrator
*
*/
public interface Watcher {
//更新自己
public void update(String str);
}
/**
* 具体主题角色:
* 实现抽象主题角色
* @author Administrator
*
*/
public class ConcreteWatched implements BeWatched{
//创建一个队列来存储一个或多个观察者
private ArrayList<Watcher> al= new ArrayList<Watcher>();
@Override
public void addWatcher(Watcher watcher) {
al.add(watcher);//添加观察者到指定队列中
}
@Override
public void removeWatcher(Watcher watcher) {
al.remove(watcher);//从队列中删除观察者
}
@Override
public void notifyWatchers(String str) {
//遍历队列
for(int i=0;i<al.size();i++){
Watcher watcher = al.get(i);//获取队列中的观察者对象
watcher.update(str);//调用它的update()方法
}
}
}
/**
* 具体的观察者角色:
* 实现抽象观察者角色
* @author Administrator
*
*/
public class ConcreteWatcher implements Watcher{
@Override
public void update(String str) {
System.out.println("已经收到通知:"+str);
}
}
/**
* 测试类
* @author Administrator
*
*/
public class ClientTest {
public static void main(String[] args){
//创建被观察者对象
ConcreteWatched watched = new ConcreteWatched();
//创建观察者
ConcreteWatcher watcher1 = new ConcreteWatcher();
ConcreteWatcher watcher2 = new ConcreteWatcher();
ConcreteWatcher watcher3 = new ConcreteWatcher();
//添加多个观察者
watched.addWatcher(watcher1);
watched.addWatcher(watcher2);
watched.addWatcher(watcher3);
//通知观察者
watched.notifyWatchers("你好!");
//分割
System.out.println("--------------------------------");
//删除一个观察者
watched.removeWatcher(watcher1);
//再次通知观察者
watched.notifyWatchers("很好!");
}
}
程序执行结果:
已经收到通知:你好!
已经收到通知:你好!
已经收到通知:你好!
--------------------------------
已经收到通知:很好!
已经收到通知:很好!
三 对于java中的观察者模式
java中的内置观察者模式有两个类:一个是observable被观察者类,一个是observer观察者接口。大体上与自定义模式相同,我们编写程序时只需继承obervable类,具体实现observer接口就可以了。
值得注意的是:调用notifyObservers()方法之前,必须先调用setChanged()方法。这是因为observable类中把changed变量初始化为false,notifyObservers()方法会先检查该变量是否为true,如果不为ture,就不会调用update()方法,这就要我们调用notifyObservers()之前,先用setChanged()方法将changed变量设置为true。
import java.util.Observable;
import java.util.Observer;
class Observe extends Observable {
// 程序的入口
public static void main(String args[]) {
Observe watched = new Observe();// 创建被观察对象
FirstObserver watch = new FirstObserver();// 创建观察者对象(可以创建多个)
watched.addObserver(watch);
watched.toWatchers("你好!");
}
// 通知观察者的方法
public void toWatchers(String str) {
this.setChanged();// 被观察者发生变化,把changed设置为true
this.notifyObservers(str);// 通知观察者
}
}
class FirstObserver implements Observer {
// 重写更新方法
public void update(Observable o, Object arg) {
System.out.println("被观察者发生变化,观察者已收到通知:"+arg);
}
}
被观察者发生变化,观察者已收到通知:你好!
四 浅析监听器的工作原理
刚开始接触监听器的时候,很是不理解为什么我点击按钮(触发事件)监听器会自动运行,而且每当我应用监听器处理事件的时候,就会困惑不已。学完观察者模式之后,渐渐的对这个问题有了一个清晰地认识——首先,创建监听器对象(具体观察者对象),然后将监听器添加到事件源(具体主题角色)上,最后事件源变化触发事件(具体主题角色状态改变,通知观察者)!其实就是观察者模式的实现。
分享到:
相关推荐
通过一个小的Android应用,学习一下设计模式之观察者模式;观察者模式定义对象间一种一对多的依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。这里演示了通过改变一个数值来改变...
主要给大家介绍了关于java监听器实现和原理的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
主要介绍了Java设计模式之监听器模式,结合实例形式较为详细的分析了java设计模式中监听器模式的概念、原理及相关实现与使用技巧,需要的朋友可以参考下
以往我们使用javascript实现的观察者模式都是通过使用回调函数配合dom上的event事件来操作的,而“Watch.js”可以为javascript的对象实现观察者模式,监听对象的变化。用麻雀虽小五脏俱全来描述Watch.js比较合适。...
附件是个观察者模式高级应用地demo,实现了事件分发机制,例如当创建一个新用户后,发送创建用户地事件,事件总线里面有对创建用户地事件监听地监听器就会得到相应地执行,比较适合那种当一个对象改变状态,依赖它的...
java内置的观察者模式,用于日后复习查阅。
其中包括观察者设计模式、监听器设计模式。第二部分为监听器用法。详细讲解了Servlet相关的八大监听器,并通过两个实际项目应用综合演示了它们的用法。 北京动力节点-05监听器专题-001-设计模式分类北京动力节点-05...
深入全面的讲解了ORACLE监听器的工作原理和工作过程、 如何配置以及经常出现的问题和解决方法。
1. 发布订阅/观察者模型,...3.对解耦代码有很大的帮助,比如多种业务场景做完都要插入通知消息,每个场景代码在做完业务逻辑,直接发布一个对应的事件,让监听器去处理监听逻辑即可,而不需要每个场景都加这一段代码。
浅谈Java串行端口技术协议 浅谈JAVA串行端口技术协议 1 一、串行通讯慨述 2 二、RS232通讯基础 2 三、常见的边线方式 2 四、小技巧:如何辨别TXD和RXD端口?...3.2.1、下面是一个监听器的示例: 10
Java简单几个类实现万能事件总线,采用享元模式和监听器模式。 使用方法很简单,直接EventCenter.get().addListener(key,()->{...你的代码快...});就行, 无论在哪,只要执行EventCenter.get().sendMessage(key,...
java过滤器、监听器拦截器原理个人总结.pdf
基于 RBAC与监听器机制设计作业管理软件
第13章使用Servlet过滤器和监听器,基础知识
网络改变观察者 android网络改变了监听器使用观察者模式
观察者模式是经典设计模式中很常用的一种,平常我们看到的监听器,基本上都是采用这种设计模式实现的,这里探讨一下观察者模式的演化
NULL 博文链接:https://coco-young.iteye.com/blog/1275485
当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。 例如:创建一个“人”类Class Person 人拥有吃的方法public void eat(){},我们的目的是,在这个人吃之前要提醒他洗手,所以我们要...
包含策略模式,单件模式,迭代器与组合模式,工厂模式,观察者模式,命令模式,适配器与外观模式,装饰者模式的问题描述,类图,源码,运行截图。
下面介绍几种常用的设计模式,包括单例模式、工厂模式、观察者模式、建造者模式、原型模式、适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和策略模式。 单例模式(Singleton Pattern) 单例模式...