Part I
JDK1.2后,Java提供了对观察者模式的支持接口和实现类。
其中接口 java.util.Observer 用来指定观察者,观察者必须实现 void update(Observable o, Object arg) 方法。
而 java.util.Observable 用来指定观察物(被观察者、可被观察的),并且提供了一系列的方法。读者可以很轻易的使用这个接口和实现类来实现观察者模式。
Part II
java.util.Observer 只有一个简单的方法 void update(Observable o, Object arg)
其中,参数 Observable o 用于指定触发 update 方法的对象, Object arg 用于指定触发 update 方法时候的附加参数。
如果有桌面应用开发的读者应该很了解,这跟事件处理机制是完全一样的,其中 Observable o 可被看作事件源。 Object arg 可被看作消息。
Part III
说了那么多,我们还是动手写个例子吧。这里我们以读者订阅杂志为例子。
package com.gzmu.observer.observable;
import java.util.Observable;
public class Publisher extends Observable {
private String magazineName;
public String getMagazineName() {
return magazineName;
}
public void publish(String magazineName) {
this.magazineName = magazineName;
setChanged();
notifyObservers(this);
}
}
package com.gzmu.observer.observer;
import java.util.Observable;
import java.util.Observer;
import com.gzmu.observer.observable.Publisher;
public class Reader implements Observer {
@Override
public void update(Observable o, Object arg) {
Publisher p = (Publisher) o;
System.out.println("我要订阅" + p.getMagazineName());
}
}
package com.gzmu.observer.test;
import org.junit.Test;
import com.gzmu.observer.observable.Publisher;
public class TestCase {
@Test
public void register() {
Publisher publisher = new Publisher();
publisher.publish("Kent.Kuan的技术空间");
}
}
这里很清楚的看到,当出版社出版杂志的时候,会主动的告知读者,读者就会订阅杂志,这也是一种主动推送的模式。
Part IV
这里大家会发现,调用 notifyObservers() 的时候,为什么传进当前对象 this 呢?而这个 this, 我们在读者那也没用到啊。这个问题曾经也让我觉得很苦恼,之前我也不清楚为什么观察者要拿到被观察对象的引用,但是,我们看看下面这个例子。
首先我们引用一个新的类:
package com.gzmu.observer.observable;
import java.util.Observable;
public class TVStation extends Observable {
private String programmeName;
public void play(String programmeName) {
this.programmeName = programmeName;
setChanged();
notifyObservers(this);
}
public String getProgrammeName() {
return programmeName;
}
}
然后修改Reader和TestCase:
package com.gzmu.observer.observer;
import java.util.Observable;
import java.util.Observer;
import com.gzmu.observer.observable.Publisher;
import com.gzmu.observer.observable.TVStation;
public class Reader implements Observer {
@Override
public void update(Observable o, Object arg) {
if (o instanceof Publisher) {
Publisher p = (Publisher) o;
System.out.println("我要订阅" + p.getMagazineName());
}
if (o instanceof TVStation) {
TVStation t = (TVStation) o;
System.out.println("我要收看" + t.getProgrammeName());
}
}
}
package com.gzmu.observer.test;
import org.junit.Test;
import com.gzmu.observer.observable.Publisher;
import com.gzmu.observer.observable.TVStation;
import com.gzmu.observer.observer.Reader;
public class TestCase {
@Test
public void register() {
Reader reader = new Reader();
Publisher publisher = new Publisher();
publisher.addObserver(reader);
TVStation tvStation = new TVStation();
tvStation.addObserver(reader);
publisher.publish("Kent.Kwan的技术空间");
tvStation.play("色戒");
}
}
最后我们可以看到,同一个观察者其实是可以注册到不同的被观察者上面的,而传过来的 Oberverable o 其实可以用来检验到底是谁发过来的消息。
除此以外,我们还可以在接受到消息之后,进行撤销观察的工作。
package com.gzmu.observer.observer;
import java.util.Observable;
import java.util.Observer;
import com.gzmu.observer.observable.Publisher;
import com.gzmu.observer.observable.TVStation;
public class Reader implements Observer {
@Override
public void update(Observable o, Object arg) {
if (o instanceof Publisher) {
Publisher p = (Publisher) o;
p.deleteObserver(this);
System.out.println("我要订阅" + p.getMagazineName());
}
if (o instanceof TVStation) {
TVStation t = (TVStation) o;
System.out.println("我要收看" + t.getProgrammeName());
}
}
}
通过 deleteObserver() 方法就可以撤销观察出版社对象。
分享到:
相关推荐
观察者模式(Observer Pattern)是设计模式中的一种行为模式,它允许一个对象,当其状态发生改变时,能够自动通知所有依赖它的其他对象。在Java中,这种模式已经被内置到语言核心,使得开发者可以轻松地实现事件驱动...
在Java中,`java.util.Observable`类和`java.util.Observer`接口提供了对观察者模式的内置支持。`Observable`类代表被观察的对象,它可以有多个观察者,而`Observer`接口则定义了观察者的通用行为。 ### `...
在Java中,观察者模式的实现主要依赖于Java的`java.util.Observable`类和`java.util.Observer`接口。`Observable`类代表被观察的对象,它可以有多个观察者;`Observer`接口则代表观察者,它们需要实现`update`方法来...
在Java中,观察者模式的实现主要依赖于`java.util.Observable`类和`java.util.Observer`接口。`Observable`类代表被观察的对象,而`Observer`接口则表示观察者。下面我们将详细介绍如何在Java中实现观察者模式。 1....
Java标准库提供了`java.util.Observable`和`java.util.Observer`接口,用于实现观察者模式。 首先,我们需要创建一个`Observable`类的子类,代表我们的主题。这个类需要维护一个观察者列表,并提供添加、删除观察者...
在Java中,`java.util.Observable` 和 `java.util.Observer` 是内置支持观察者模式的类。 标题中的“java观察者模式Demo”指的是使用Java语言来演示观察者模式的应用。通常,这个Demo会包含一个可观察的对象...
在Java中,`java.util.Observable`和`java.util.Observer`接口提供了内置的支持来实现观察者模式。`Observable`类代表被观察的对象,而`Observer`接口则表示观察者。让我们详细解析这个实例: 1. **定义主题...
在Java中,观察者模式的实现通常基于Java的内置接口`java.util.Observer`和`java.util.Observable`。下面将详细解释观察者模式的概念、结构以及如何在Java中应用这个模式。 **观察者模式的核心概念:** 1. **主题...
在Java中,观察者模式是通过Java的内置接口`java.util.Observer`和`java.util.Observable`来实现的。 在"java 观察者模式经典案例"中,我们以报社和读者为例来讲解这一模式。假设报社是被观察者(Observable),...
在Java中,观察者模式的实现基于Java.util.Observable和Java.util.Observer接口。 Java的观察者模式通常包含两个主要角色: 1. **主题(Subject)**:这是被观察的对象,它可以是具体的类或抽象类。主题维护了一个...
JDK里提供的observer设计模式的实现由java.util.Observable类和 java.util.Observer接口组成。从名字上可以清楚的看出两者在Observer 设计模式中分别扮演的角色:Observer是观察者角色,Observable是被观察目标...
在Java中,观察者模式通常通过`java.util.Observable`类和`java.util.Observer`接口来实现。 **观察者模式的核心概念** 1. **主题(Subject)**:主题是被观察的对象,它维护了一个观察者列表,并负责在自身状态...
在Java中,观察者模式可以通过Java的内置接口`java.util.Observer`和`java.util.Observable`来实现。`Observer`接口代表观察者,而`Observable`类代表被观察的对象,也称为主题(Subject)。下面将详细介绍这两个...
在Java中,`java.util.Observable`类和`java.util.Observer`接口提供了对观察者模式的支持。 1. **`Observable`类**:代表被观察的对象,可以注册多个观察者,并在状态改变时通知它们。`Observable`类提供了`...
在这个名为“运用MVC模式及观察者模式的java小程序”的项目中,我们重点探讨了两种经典的设计模式:Model-View-Controller(MVC)模式和Observer(观察者)模式。这两种模式在JavaWeb开发中扮演着至关重要的角色。 ...
在Java中,观察者模式通常通过`java.util.Observable`类和`java.util.Observer`接口来实现。`Observable`类代表抽象主题,`Observer`接口代表抽象观察者。让我们详细解析一下这两个核心组件以及它们如何协同工作。 ...
在Java中,观察者模式的实现通常依赖于`java.util.Observable`类和`java.util.Observer`接口。`Observable`类代表被观察的对象,而`Observer`接口则是观察者的接口。以下是对这两个关键组件的详细解释: 1. `...
在Java中,观察者模式得到了内置支持,主要体现在`java.util.Observable`类和`java.util.Observer`接口中。下面我们将详细讨论这个模式以及如何使用Java内置的支持来实现它。 首先,我们要理解观察者模式的基本概念...
在Java中,观察者模式通常通过`java.util.Observable`和`java.util.Observer`这两个接口来实现。`Observable`类代表被观察的对象,它可以添加多个观察者,并在状态变化时通知它们。而`Observer`接口则定义了观察者的...
在Java中,标准的观察者模式实现是通过`java.util.Observable`类和`java.util.Observer`接口来完成的,但本示例特别指出未使用这两个内置工具类,而是完全自定义实现了观察者模式。 观察者模式的主要组件包括: 1. ...