在Java中通过Observable类和Observer接口实现了观察者模式。Observer对象是观察者,Observable对象是被观察者。
1. 实现观察者模式
实现观察者模式非常简单,
[1]创建被观察者类,它继承自java.util.Observable类;
[2]创建观察者类,它实现java.util.Observer接口;
[3]对于被观察者类,
添加它的观察者:
void addObserver(Observer o)
|
addObserver()方法把观察者对象添加到观察者对象列表中。
当被观察事件发生时,执行:
setChanged();
notifyObservers();
|
setChange()方法用来设置一个内部标志位注明数据发生了变化;notifyObservers()方法会去调用观察者对象列表中所有的Observer的update()方法,通知它们数据发生了变化。
只有在setChange()被调用后,notifyObservers()才会去调用update()。
[4]对于观察者类,实现Observer接口的唯一方法update
void update(Observable o, Object arg)
|
形参Object arg,对应一个由notifyObservers(Object arg);传递来的参数,当执行的是notifyObservers();时,arg为null。
2.实例一
NumObserable是一个被观察者,当它的成员变量data的数值发生变化时,会通知所有的观察者。
NumObserable.java
package com.zj.observer;
import java.util.Observable;
public class NumObservable extends Observable {
private int data = 0;
public int getData() {
return data;
}
public void setData(int i) {
data = i;
setChanged();
notifyObservers();
}
}
|
NumObserver是观察者。当它的被观察者(NumObserable)执行了notifyObservers()后,它会执行uodate()方法。
NumObserver.java
package com.zj.observer;
import java.util.Observable;
import java.util.Observer;
public class NumObserver implements Observer{
public void update(Observable o, Object arg) {
NumObservable myObserable=(NumObservable) o;
System.out.println("Data has changed to "+myObserable.getData());
}
}
|
测试类SingleTest,在这里将观察者加入到被观察者的观察列表中。
SingleTest.java
package com.zj.observer;
public class SingleTest {
public static void main(String[] args) {
NumObservable number = new NumObservable();
number.addObserver(new NumObserver());
number.setData(1);
number.setData(2);
number.setData(3);
}
}
|
结果:
Data has changed to 1
Data has changed to 2
Data has changed to 3
3.实例二
这个实例中,还是对data进行观察,拥有两个观察者,分别观察奇数和偶数的变化,通过notifyObservers(arg)中的参数arg来识别通知信息。
被观察者NumsObservable.java
package com.zj.observers;
import java.util.Observable;
public class NumsObservable extends Observable {
public final static Integer ODD = 1;
public final static Integer EVEN = 2;
private int data = 0;
public int getData() {
return data;
}
public void setData(int i) {
data = i;
Integer flag = EVEN;
if ((data & 0x0001) == 1)
flag = ODD;
setChanged();
notifyObservers(flag);
}
}
|
奇数观察者OddObserver.java
package com.zj.observers;
import java.util.Observable;
import java.util.Observer;
public class OddObserver implements Observer {
public void update(Observable o, Object arg) {
if (arg == NumsObservable.ODD) {
NumsObservable myObserable = (NumsObservable) o;
System.out.println("OddObserver:Data has changed to " + myObserable.getData());
}
}
}
|
偶数观察者EvenObserver.java
package com.zj.observers;
import java.util.Observable;
import java.util.Observer;
public class EvenObserver implements Observer {
public void update(Observable o, Object arg) {
if (arg == NumsObservable.EVEN) {
NumsObservable myObserable = (NumsObservable) o;
System.out.println("EvenObserver:Data has changed to " + myObserable.getData());
}
}
}
|
测试类MultiTest.java
package com.zj.observers;
public class MultiTest {
public static void main(String[] args) {
NumsObservable number = new NumsObservable();
number.addObserver(new OddObserver());
number.addObserver(new EvenObserver());
number.setData(1);
number.setData(2);
number.setData(3);
}
}
|
结果:
OddObserver:Data has changed to 1
EvenObserver:Data has changed to 2
OddObserver:Data has changed to 3
相关推荐
Java 设计模式最佳实践是软件开发中的重要主题,它涵盖了多种模式,这些模式已被广泛接受并应用于实际项目中,以解决常见的编程问题和提升代码的可读性、可维护性和可扩展性。在这个主题中,我们将深入探讨一些关键...
1. 创建型模式:这类模式主要处理对象的创建,使得代码与对象的创建过程解耦。包括单例模式(Singleton)、工厂模式(Factory)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)...
Java的`Observer`和`Observable`接口实现了观察者模式。 13. **责任链模式**:避免请求的发送者和接收者之间的耦合,将多个处理者组织成链,请求沿着链传递,直到被某个处理者处理。在Java中,异常处理机制某种程度...
《设计模式——Java语言中的应用》是一本专为Java开发者深入理解面向对象设计而编写的经典书籍。设计模式是软件工程领域中经过实践验证的、解决常见问题的有效方案,它们代表了在特定上下文中,针对特定问题的最优...
本资源“设计模式:Java语言中的应用”提供了一个深入理解和应用设计模式的平台,适合Java开发者和软件架构师学习。 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。在Java中,单例模式通常通过私有...
标题中的"OBserver模式设计实现"是指探讨如何在实际编程中应用观察者模式,无论是用Java还是C++。Head First系列书籍是著名的编程学习资源,以易懂的方式解释复杂的设计模式。在描述中提到的"Head First模式设计用的...
在这个场景中,我们将讨论如何在Java中应用Observer模式,特别是在电子商务系统中的应用。 Observer模式的核心思想是定义一个一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当主题对象的状态发生变化...
在Java中,`java.util.Observable`类和`java.util.Observer`接口就是对Observer模式的一种实现。`Observable`类代表主题,`Observer`接口代表观察者。当我们创建一个`Observable`对象并添加`Observer`对象到其观察者...
《Java EE设计模式:Spring企业级开发最佳实践》是一本深度探讨如何在企业级Java应用程序中有效运用设计模式的著作。这本书聚焦于Spring框架,它作为Java EE领域中最为广泛使用的开源框架之一,极大地简化了企业级...
Java EE 设计模式:Spring 企业级开发最佳实践 Java EE 设计模式是指在 Java 企业版(Java Enterprise Edition)中应用的设计模式,旨在提高软件系统的可维护性、可扩展性和可重用性。Spring 是当前最流行的 Java ...
《设计模式:java语言中的应用》这本书深入探讨了如何在Java中应用设计模式,这些模式是软件开发中的最佳实践,可以提高代码的可读性、可维护性和复用性。 1. **State模式**:State模式允许对象在其内部状态改变时...
5. 观察者模式:Java.util.Observable和java.util.Observer接口提供了观察者模式的支持,广泛应用于事件驱动编程,例如GUI组件间的通信。 6. 模板方法模式:在Java中的JDBC模板类,如JdbcTemplate,定义了数据库...
本资料“设计模式:Java语言中的应用.rar”详细探讨了如何在Java环境中有效地运用这些模式。 首先,我们要理解设计模式的基本分类。设计模式通常分为三大类:创建型模式、结构型模式和行为型模式。创建型模式如单例...
在Java中,Observer模式主要通过java.util.Observable和java.util.Observer接口来实现。Observable类代表被观察的对象,它可以添加观察者,删除观察者,并通知所有的观察者。Observer接口则定义了一个update方法,当...
《设计模式:Java语言中的应用》这本书或资料可能深入探讨了如何在Java环境中运用这些模式。 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。在Java中,单例可以通过静态内部类、枚举、双重检查锁定...
总之,"SimpleTodo:Codepath Observer 类的合格项目"是一个学习和实践Observer模式的绝佳案例,它涵盖了Android开发中的数据持久化、事件驱动编程和UI更新等重要概念,对于Java和Android开发者来说,这是一个不容...
在Java编程中,有23种经典的GoF(Gang of Four)设计模式,它们被分为三大类:创建型、结构型和行为型。本资源集合了这些模式的详细解释与源码分析,旨在帮助开发者深入理解和应用设计模式。 1. 创建型模式...
Java.util.Observable和Observer接口就是观察者模式的实现。 10. 装饰模式:装饰模式动态地给一个对象添加一些额外的职责。它提供了比继承更多的灵活性,避免了因为功能增加而导致类的急剧膨胀。 以上只是部分设计...
4. 适配器模式:将一个类的接口转换成客户期望的另一个接口,使原本因接口不兼容而无法一起工作的类能协同工作。在Java中,通过继承或组合来实现。 5. 桥接模式:将抽象部分与实现部分分离,使它们可以独立变化。在...