`
草帽当家的
  • 浏览: 24974 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
文章分类
社区版块
存档分类
最新评论

观察者模式(浅谈监听器工作原理)

阅读更多
        从某种角度来说,我们总是处于两种生活状态:观察者与被观察者。当处于观察者状态时,被观察的对象会向我们发出某种信息,使我们产生某种心理活动或行为状态的改变。当我们处于被观察者状态时,我们的行为活动又可以以信息的方式影响观察者。(大多数情况下是两种状态并存。)
        作为一种面向对象的编程语言,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);
	}
}

被观察者发生变化,观察者已收到通知:你好!

四    浅析监听器的工作原理
        刚开始接触监听器的时候,很是不理解为什么我点击按钮(触发事件)监听器会自动运行,而且每当我应用监听器处理事件的时候,就会困惑不已。学完观察者模式之后,渐渐的对这个问题有了一个清晰地认识——首先,创建监听器对象(具体观察者对象),然后将监听器添加到事件源(具体主题角色)上,最后事件源变化触发事件(具体主题角色状态改变,通知观察者)!其实就是观察者模式的实现。
5
3
分享到:
评论
1 楼 木子李jones 2016-09-20  

相关推荐

    java监听器的实现和原理详解

    Java监听器的实现和原理详解 Java监听器是一种非常重要的设计模式,在Java中广泛应用于事件驱动编程。监听器模式的主要思想是将事件源和...了解监听器模式的原理和实现,可以帮助我们编写更加灵活、可扩展的代码。

    设计模式-观察者

    例如,当用户在网页上点击按钮时,按钮作为被观察者,会触发一系列事件,这些事件的监听器(观察者)会接收到通知并执行相应的操作,如弹出对话框、刷新页面等。 6. **优缺点**:优点是实现了对象间的抽象耦合,...

    IOS 观察者模式实例Demo

    在这个“IOS 观察者模式实例Demo”中,我们将深入探讨如何在iOS应用中实现观察者模式,并通过实际的代码示例来理解其工作原理。 首先,观察者模式的主要角色有两个:主题(Subject)和观察者(Observer)。主题是被...

    设计模式:观察者模式java和javabean

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动的编程...

    观察者模式最佳实践

    可能包括一个简单的事件发布系统,其中有一个事件源(主题)和多个事件监听器(观察者),通过触发事件和响应事件来演示模式的用法。 在实际开发中,Java的`java.util.Observable`和`java.util.Observer`类库提供了...

    观察者模式java实现观察者设计模式

    在Java中,我们可以利用Java提供的内置监听器机制来实现观察者模式,例如`ApplicationListener`和`ApplicationEvent`,这两个类主要用于Swing或JavaFX应用程序中的事件处理。 首先,我们来看`ApplicationListener`...

    c++观察者模式实例

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在C++中,这种模式经常用于游戏开发,特别是在像cocos2d-x这样的2D游戏引擎...

    设计模式之观察者模式(Observer Pattern)

    观察者模式,也被称为发布-订阅模式或事件驱动模式,是软件设计模式中的一种行为模式。这个模式的主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并...

    java23种设计模式之观察者模式

    观察者模式有多种变体,如发布/订阅模式、模型-视图-控制器(MVC)架构中的模型与视图之间的关系,以及Java的事件监听机制等。 综上所述,观察者模式是软件设计中的重要工具,它通过引入一种间接的依赖关系,使得...

    观察者模式学习

    除了标准实现,还有很多其他语言和框架提供了观察者模式的支持,例如在C#中,可以使用System.ComponentModel.INotifyPropertyChanged接口来实现,而在JavaScript中,可以通过事件监听器或者发布/订阅模式来实现类似...

    js观察者模式列子js观察者模式列子

    例如,DOM事件监听器就是观察者,当特定事件触发时,它们会接收到通知并执行相应的处理函数。此外,现代前端框架如React和Vue也大量使用观察者模式来实现组件状态的响应式更新。 总结来说,JavaScript观察者模式是...

    HeadFirst 设计模式学习笔记2--观察者模式 demo

    例如,在Web开发中,可以使用观察者模式处理用户交互事件,当用户触发某个操作时,相关的监听器(观察者)会得到通知并执行相应的逻辑。 总的来说,HeadFirst设计模式的学习笔记2关于观察者模式的演示,旨在帮助...

    观察者模式Observer

    观察者模式(Observer)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在软件开发中广泛应用于事件处理和实时...

    观察者模式设计

    ### 观察者模式设计详解 #### 概述 观察者模式是一种常用的设计模式,用于定义对象间的依赖关系。...在框架开发中,事件监听器也是观察者模式的具体体现。掌握观察者模式对于提高软件设计的质量和灵活性具有重要意义。

    观察者模式在Java事件处理中的应用研究.pdf

    本文将深入分析观察者模式的组成部分和应用场景,并探讨Java事件处理机制的原理,以及事件源、事件、监听器与观察者设计模式中各角色的对应关系。 观察者模式的组成部分包括被观察者(Subject)和观察者(Observer...

    Android,设计模式,观察者模式

    通过一个小的Android应用,学习一下设计模式之观察者模式;观察者模式定义对象间一种一对多的依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。这里演示了通过改变一个数值来改变...

    Java设计模式之监听器模式实例详解

    监听器模式是Java设计模式中的一种行为型模式,主要用于监听某些事件的发生,并在事件发生时自动执行预定义的操作。在实际开发中,监听器模式可以用于多种场景,如UI事件处理、事件广播、异步通知等。 在监听器模式...

    观察者模式与JavaBeans事件

    观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Java中,这种模式被广泛应用于事件处理,例如JavaBeans事件。 JavaBeans...

    Android观察者模式设计思想

    这些接口实现了观察者模式,当用户触发特定事件时,监听器会接收到通知并执行相应的回调方法。开发者可以通过实现这些接口,为UI组件添加交互功能。 4. **LiveData与ViewModel**: 在Android架构组件中,LiveData是...

    观察者模式下载2进阶篇

    观察者模式下载2进阶篇主要探讨了如何利用观察者模式来实现一个高效且灵活的下载功能,并结合自定义View来展示下载进度。这个实践项目不仅涵盖了设计模式的应用,还涉及了Android UI自定义和多线程下载的技术,对...

Global site tag (gtag.js) - Google Analytics