`

JAVA设计模式之Observer模式

阅读更多

观察者模式,在开发中经常使用到。特别是在UI层,那么什么是观察者模式呢?观察者模式,有以下几个要点。

1、被观察者和观察者是一对多的关系,也就是同一个被观察者可以被多个观察者来观察。这样,在实现被观察者的时候,需要用一个集合的数据结构来存放所有观察该对象的观察者。

2、观察者要想观察被观察者,需要将自身注册给被观察者。

3、被观察者的属性发生变化的时候,需要通知所有注册了自己的观察者。

4、被观察者决定,哪些属性发生变化了,通知所有观察者。

java已经将Observer模式加入JDK中了,在java.util包下,分别有Observer接口和Observable类。所以,我们定义的观察者实现Observer接口就可以了,而被观察者继承Observable就可以了,在某属性变化的时候,使用setChanged(),和notifyObservers(args)就可以了。然后,在使用的时候,注册观察者,使用addObserver(Observer)就可以了。

观察者模式的组件结构如下:

自己

可以看到,Observer中只有一个update方法,这个方法就是,当被观察者的属性发生改变的时候,该方法会被调用。

在java的jdk中,还有另外一组模型,这组模型是基于事件处理的模式,包含EventListener标识接口,EventObject事件对象,下面我们看看使用这个模型来实现事件监听的组件结构,如下图:

tt

由于EventListener接口没有任何方法申明,我们继承该接口自定义一个接口SampleEventListener,其中包含一个处理事件的方法

SampleEvent继承了EventObject事件对象,该对象包含了一个对事件源(EventSource)的引用。EventSource中包含了一个Vector集合对象用来保存所有注册了的监听器对象。

这样,当事件源(EventSource)触发notifyListeners()方法时,Vector中所有Listener就会调用handleEvent(SampleEvent)方法,

然后在该方法中处理事件。这样,事件源经过事件的包装,成为事件的属性之一,然后传递给监听器来处理。这里我们可以看到,这里的监听器(Listener)就相当于Observer,而EventSource就相当于Observable。

对于Observer形式的观察者模式和Event的观察者模式,是相似又有区别的。

Observer中的Observable已经封装好了很多操作,而且,不分事件源和事件,将其合并成为一个Obsevable对象。

这两种方式都可以来实现观察者模式。

分享到:
评论

相关推荐

    java设计模式之Observer参考.pdf

    java设计模式之Observer参考.pdf

    java设计模式之Observer[整理].pdf

    java设计模式之Observer[整理].pdf

    Java设计模式 设计模式介绍

    1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、...

    JAVA设计模式chm文档

    设计模式之Observer 设计模式之Chain of Responsibility(职责链) 设计模式之Command 设计模式之State 设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

    JAVA设计模式之行为模式

    这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...

    Java 设计模式-观察者模式(Observer)

    结合微信公众号讲解观察者模式,生动形象,关键是上手快啊

    33种JAVA设计模式DEMO

    这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。 工厂模式(Factory Pattern) 抽象工厂模式...

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...

    Java设计模式之观察者模式(Observer模式)介绍

    主要介绍了Java设计模式之观察者模式(Observer模式)介绍,Java深入到一定程度,就不可避免的碰到设计模式(design pattern)这一概念,了解设计模式,将使自己对java中的接口或抽象类应用有更深的理解,需要的朋友可以...

    23种设计模式的java源代码

    里面包含了23中设计模式源代码,其中包括工厂模式(Factory)、单例(Singleton)、观察者模式(Observer)、适配器模式(Adapter)、Template模式、Decorate模式、proxy模式等 这些代码对于初学者看起来稍微复杂一些,我...

    java设计模式教程+源代码

    AbstractFactory ( 抽象工厂 ) FactoryMethod ( 工厂方法 ) Singleton ( 单态模式 ) ...Observer ( 观察者模式 ) State ( 状态模式 ) Strategy ( 策略模式 ) TemplateMethod ( 模板方法 ) Visitor ( 访问者模式 )

    java设计模式期末考试选择题100道

    适合Java设计模式期末考试选择题复习,形式如下: 10.(单选题)Facade(外观)模式的意图是 正确答案: A A.希望简化现有系统的使用方法,你需要定义自己的接口 B.将一个无法控制的现有对象与一个特定借口相匹配。 C....

    JAVA 设计模式PPT

    首先介绍了Java中面向对象特性和技术,逐个分析Abstract Factory;Builder;Prototype;Singleton;Adapter (对象);Bridge;Composite;Decorator;Facade;Flyweight;Proxy;Iterator;Observer等模式

    详解Observer Pattern(观察者模式)在Java中的使用原理

    该示例是翻写一老外Observer Pattern的例子,本人觉得该示例是对该模式的非常精典的说明,于是花点功夫来翻写它,因为他的代码没有注释说明该模式的设计思想怎样体现在代码中去,所以,本人结合代码注释了关键代码的...

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    设计模式之Observer - 观察者模式

    NULL 博文链接:https://lgd-java2eye.iteye.com/blog/760350

    [行为模式]head first 设计模式之观察者模式(observer)

    NULL 博文链接:https://jacky-dai.iteye.com/blog/1132063

    Java面试 java设计模式整理 单例、工厂、策略等 面试使用,学习使用

    java的设计模式大体上分为三大类: 2 设计模式遵循的原则有6个: 2 1. 工厂模式(Factory Method) 2 2. 抽象工厂模式(Abstract Factory) 3 3. 单例模式(Singleton) 4 4.建造者模式(Builder) 4 5. 原型模式...

    HeadFirst 设计模式java源代码

    《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第 11章陆续介绍的设计 5b4 式为Strategy、Observer、Decorator、...

    Head First 设计模式 JAVA源码

    第1章到第11章陆续介绍的设计模式为Strategy、Observer、Decorator、AbstractFactory、FactoryMethod、Singleton,Command、Adapter、Facade、TemplateMethod、Iterator、Composite、State、Proxy。最后三章比较特别...

Global site tag (gtag.js) - Google Analytics