`
thinkingmt
  • 浏览: 24691 次
  • 性别: Icon_minigender_1
  • 来自: 桂林
社区版块
存档分类
最新评论

About Observer & Observable

阅读更多

从字面意义上看:Observer观察者,Observable可观察的。当然是观察者对可观察的对象进行观察。乍一看,这观察没什么难的,用普通的 if 语句就可以实现这个功能,但其实这里的Observer Pattern是有一些很好的优点的。

 

看程序前,先通过API对Observer Pattern进行最基本,最准确的认识和理解。

----------------------------------------------------------------------------------------------------------------------------------

先看java.util.Observable,不要被其名字所误导(因为名字看起来像个interface,如接口comparable就是这样类型的名字),它其实是一个类。如果想让某个类被观察,只要将这个类继承Observable就行了。

 

其主要的方法有:

void addObserver(Observer o)      ---添加观察者

boolean hasChanged()                  ---测试对象是否改变

protected void setChanged()         ---标记此Observable对象为已改变对象;此时hasChanged()返回true

void notifyObservers(Object arg)   ---如果hasChanged()方法指示对象已改变,则通知其所有观察者,并调用clearChanged()方法指示此对象不再改变。

protected void clearChanged()      ---指示对象不再改变,所以此时hasChanged()返回false

----------------------------------------------------------------------------------------------------------------------------------

再看java.util.Observer,它是一个接口。实现这个接口的类,可以对Observable对象进行观察。

 

其主要的方法有:

void update(Observable o, Object arg)   ---当调用Obserbable对象的notifyObservers时,此方法作出响应。

----------------------------------------------------------------------------------------------------------------------------------

 

讲一个实例:

 

程序结构是这样的:

 

 

 

import java.util.Observable;

public class Product extends Observable
{
    private String name;
    private double price;
    
    public Product()
    {
        String defaultName ="default name";
        name = defaultName;
        double defaultPrice = 100;
        price = defaultPrice;
    }
    
    public void setName(String currentName)
    {
        System.out.println("Previous name is:"+name);
        name=currentName;
        setChanged();
        System.out.println("Now the method hasChanged() return:"+hasChanged());
        notifyObservers(currentName);
        System.out.println("Now the method hasChanged() return:"+hasChanged()+"\n\n");
    }
    
    public void setPrice(double currentPrice)
    {
        System.out.println("Previous price is:"+price);
        price=currentPrice;
        setChanged();
        System.out.println("Now the method hasChanged() return:"+hasChanged());
        notifyObservers(currentPrice);
        System.out.println("Now the method hasChanged() return:"+hasChanged()+"\n\n");
    }
}

 

 

import java.util.Observer;
import java.util.Observable;

public class PriceObserver implements Observer
{
    public void update(Observable o,Object arg)
    {
        if(arg instanceof Double)
        System.out.println("Name changed to :"+arg);
    }
}

 

 

import java.util.Observer;
import java.util.Observable;

public class NameObserver implements Observer
{
    public void update(Observable o,Object arg)
    {
        if(arg instanceof String)
        System.out.println("Name changed to :"+arg);
    }
}

 

 

还有最后一个是测试类:

 

 

public class Tester
{
    public void test()
    {
        Product pro = new Product();
        pro.addObserver(new NameObserver());
        pro.addObserver(new PriceObserver());
        
        System.out.println("The class Product has "+pro.countObservers()+" Observers.\n");
        
        pro.setName("NEW NAME");
        pro.setName("ANOTHER NEW NAME");
        
        pro.setPrice(200);
        pro.setPrice(300);
    }
}

 

程序的输出结果如下:

 

 

 

 

程序运行的主线流程是这样的:

1. 为Product 的对象添加观察者,pro.addObserver(new NameObserver());

 

2.由于setName方法中设置了观察点(setChanged(); )

   所以,当Product 的对象发生改变时候,pro.setName("NEW NAME");

   会触发 notifyObservers(currentName);)这个方法是以setChanged()为基础的,或者说是以hasChanged()为

   基础的,因为setChanged()改变hasChanged()的返回值!

 

   3.调用Observer接口类中的update方法,是该类作出响应(NameObserver)。

      响应是:System.out.println("Name changed to :"+currentName);

  

 

 

接下来,看看这种Pattern的特殊之处。

    以前,如果想实现一个类内部的观察监督,理论上是要用if语句(其实我觉得对于一个类来说,这样更好),但是有时候是要实现一个类改变,引发其他类跟着改变的!

    这是,如果想要观察者类发生改变,就需要在被观察对象的代码中创建观察者的实例。这样就出现了调用的情况,耦合性加大了。

    此时,如果应用Observer Pattern,便会降低耦合性,符合高内聚,低耦合的设计原则。

 

     此外,Observer Pattern 还有如下特点(由于使用太少,经验不多,所以摘除网上内容,便以后深入理解):

----------------------------------------------------------------------------------------------------------------------------------

    优点:

    是实现了表示层和数据逻辑层的分离,并定义了稳定的更新消息传递机制,类别清晰,并 
    抽象了更新接口,使得可以有各种各样不同的表示层(观察者)。

 

   1、  SubjectObserver之间是松偶合的,分别可以各自独立改变,不互相依赖。

2、  Subject在发送广播通知的时候,无须指定具体的ObserverObserver可以自己决定是否要订阅Subject的通知。

3、  遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。

 

    缺点:

1、如果一个被观察者对象有很多直接和间接的观察者的话,将所有的观察者都通知到会
             花费很多时间。
2、如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致
             系统崩溃。在使用观察考模式时要特别注意这一点。
3、如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自
             恰的方式进行的。
4、虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没
             有相应的机制使观察者知道所观察的对象是怎么发生变化的。

 

form:http://mynamesky.iteye.com/blog/450194

----------------------------------------------------------------------------------------------------------------------------------

 

 

 

 

 


分享到:
评论

相关推荐

    MVC小例子 使用Java类库observer和Observable

    在"Java类库observer和Observable"的上下文中,`Observer`和`Observable`是Java标准库中的接口和类,它们实现了观察者模式,这是MVC模式中的一个重要组成部分。观察者模式允许一个对象(观察者)注册到另一个对象...

    从Observer到Observable:使用Functional Swift提升复杂iOS项目的可维护性.zip

    "从Observer到Observable:使用Functional Swift提升复杂iOS项目的可维护性"这一主题深入探讨了如何利用Functional Programming(函数式编程)的理念,特别是Swift中的Observer(观察者)和Observable(可观察)模式...

    从Observer到Observable:使用Functional Swift提升复杂iOS项目的可维护性.pdf

    文档中提到的从Observer到Observable的转变,意味着在函数式编程思维的影响下,开发者倾向于使用Observable模式来代替传统的Observer模式。Observable模式是一种响应式编程的基础,允许对象注册自己想要的事件类型,...

    observable-observer

    在Java中,`Observable`类和`Observer`接口是内置的实现,用于创建这种观察者模式。现在我们来详细探讨`Observable`和`Observer`的原理以及如何手动实现简单的`MyObservable`和`MyObserver`。 首先,`Observable`类...

    Observable与Observer

    在IT行业中,`Observable`与`Observer`是Java编程语言中的两个重要概念,它们是JavaFX和Java.util.Observable库的一部分,用于实现观察者模式。观察者模式是一种设计模式,它定义了对象之间的一对多依赖关系,当一个...

    Observer模式

    在Java中,Observer模式主要通过java.util.Observable和java.util.Observer接口来实现。Observable类代表被观察的对象,Observer接口定义了观察者的基本行为。当Observable对象的状态发生变化时,会调用Observer接口...

    Java观察者设计模式(Observable和Observer)

    在Java中,观察者模式通过`java.util.Observable`类和`java.util.Observer`接口得以实现。 一、观察者模式介绍 观察者模式的核心在于建立一种对象间的依赖关系,这种关系使得当一个对象(被观察者)的状态发生改变...

    java实现观察者模式-Java内置的观察者模式(基于Observable和Observer)

    Java内置的Observable类和Observer接口提供了基本的观察者模式功能,你可以通过继承Observable类和实现Observer接口来使用

    Observer.zip

    在Java中,观察者模式通过`java.util.Observable`类和`java.util.Observer`接口来实现。`Observable`类代表被观察的对象,而`Observer`接口则表示观察者。下面我们将深入探讨这两个关键组件以及如何使用它们。 1. *...

    我理解的 js 的观察者模式 Observable

    在这个模式中,我们有两类角色:被观察者(Observable)和观察者(Observer)。在JavaScript的世界里,这个概念与事件处理和发布/订阅模式密切相关。 `Observable`类是被观察的对象,它维护了一个观察者列表,并...

    ActionBar+ViewPager+Fragment+Observable

    `Observable`是Java的观察者模式(Observer Pattern)实现,它是`java.util.Observable`类的实例。在Android中,`Observable`常用于组件之间的通信,特别是当需要监听数据变化时。例如,当你有一个数据模型需要实时...

    sqlite&provider&observer

    SQLiteDatabase,SQLiteOpenHelper,ContentProvider,ContentResolver,ContentObserver,ContentObserverable的使用简单使用。

    Observer例子

    在Java中,我们可以使用Java内置的`java.util.Observable`类和`java.util.Observer`接口来实现Observer模式。主题类通常继承`Observable`,而观察者则实现`Observer`接口。当主题状态改变时,调用`Observable`的`...

    Observer(观察者模式)学习源码

    在Java中,Observer模式主要通过java.util.Observable和java.util.Observer接口来实现。Observable类代表被观察的对象,Observer接口则代表观察者。以下是对这两个核心组件的详细说明: 1. **Observable类**: - `...

    react-observer:ES7 的 Observable 与 React 组件

    这个现在对人来说都是相当特定的 - 理想情况下它应该支持 ES7 observable 接口,但这是有效的。 请参阅的讨论。去做 测试 可运行的例子 包含invariant用法在 DOM 元素上使用它。 import observer from 'react-...

    Observer设计模式实例

    Observer设计模式,也被称为“发布-订阅”(Publish-Subscribe)模式或“依赖倒置”模式,是软件设计中的一种行为模式。它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到...

    ObserverPattern

    在Java中,`java.util.Observable`类和`java.util.Observer`接口提供了对观察者模式的内置支持。`Observable`类代表被观察的对象,它可以添加、删除观察者,并在状态改变时通知它们。`Observer`接口则定义了观察者...

    简单理解观察者模式(Observer)

    在Java中,观察者模式是通过`java.util.Observable`和`java.util.Observer`两个接口来实现的。`Observable`接口代表被观察的对象,而`Observer`接口则代表观察者。当`Observable`对象的状态发生变化时,会调用`...

    观察者模式,Observer

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

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

    在Java中,观察者模式的实现通常涉及到Java的内置接口`java.util.Observer`和`java.util.Observable`。`Observer`接口定义了一个方法`update(Observable o, Object arg)`,当被观察的对象状态改变时,这个方法会被...

Global site tag (gtag.js) - Google Analytics