51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

设计模式 - 观察者模式

观察者模式在JAVA中的详细介绍 {#%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F%E5%9C%A8java%E4%B8%AD%E7%9A%84%E8%AF%A6%E7%BB%86%E4%BB%8B%E7%BB%8D}

观察者模式是一种设计模式,它允许对象之间建立一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在JAVA中,观察者模式是通过Observable类和Observer接口来实现的。

一、观察者模式的组成 {#%E4%B8%80%E3%80%81%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F%E7%9A%84%E7%BB%84%E6%88%90}

观察者模式主要由以下四个角色组成:

  1. 主题(Subject):被观察的对象,它维护了一个观察者列表,并提供注册和注销观察者的方法,同时当自身状态发生改变时,会通知所有观察者。

  2. 观察者(Observer):观察主题的对象,当主题状态发生改变时,观察者会自动更新。

  3. 具体主题(ConcreteSubject):主题的具体实现类,它实现了通知观察者的方法。

  4. 具体观察者(ConcreteObserver):观察者的具体实现类,它实现了更新方法。

二、JAVA中的观察者模式实现 {#%E4%BA%8C%E3%80%81java%E4%B8%AD%E7%9A%84%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F%E5%AE%9E%E7%8E%B0}

在JAVA中,java.util.Observable类和java.util.Observer接口提供了观察者模式的基本实现。其中,Observable类代表主题,Observer接口代表观察者。

1. Observable类 {#1.-observable%E7%B1%BB}

Observable类维护了一个观察者列表,并提供以下方法:

  • void addObserver(Observer o): 注册观察者。

  • void deleteObserver(Observer o): 注销观察者。

  • void notifyObservers(): 通知所有观察者。

2. Observer接口 {#2.-observer%E6%8E%A5%E5%8F%A3}

Observer接口定义了一个更新方法:

  • void update(Observable o, Object arg): 当主题状态发生改变时,该方法会被调用。

3. 具体实现 {#3.-%E5%85%B7%E4%BD%93%E5%AE%9E%E7%8E%B0}

下面是一个简单的例子,展示了如何在JAVA中使用观察者模式:

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

public class ObserverPatternExample {
public static void main(String\[\] args) {
// 创建主题对象
ConcreteSubject subject = new ConcreteSubject();
// 创建观察者对象
Observer observer1 = new ConcreteObserver("观察者1");
Observer observer2 = new ConcreteObserver("观察者2");
// 注册观察者
subject.addObserver(observer1);
subject.addObserver(observer2);
// 改变主题状态并通知观察者
subject.setState("新状态");
}
}


class ConcreteSubject extends Observable {
private String state;
public String getState() { return state; }
public void setState(String state) {
this.state = state;
// 通知所有观察者
setChanged(); // 标记状态已改变
notifyObservers(); // 通知观察者
}
}

`class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) { this.name = name; }
public void update(Observable o, Object arg) {
ConcreteSubject subject = (ConcreteSubject)o;
System.out.println(name + "收到通知,主题状态已改变为:" + subject.getState());
}
}
`

在这个例子中,我们创建了一个具体主题ConcreteSubject和一个具体观察者ConcreteObserver。当主题状态发生改变时,所有注册的观察者都会收到通知并自动更新。


赞(0)
未经允许不得转载:工具盒子 » 设计模式 - 观察者模式