希赛考试网
首页 > 软考 > 软件设计师

观察者模式的实现方法

希赛网 2024-06-06 18:14:29

观察者模式是一种常见的软件设计模式,其主要功能是在对象之间建立一种一对多的依赖关系,使得当一个对象发生改变时,其他所有依赖于它的对象都能够自动接受到更新通知。本文将从多个角度分析观察者模式的实现方法,并提供一些实例代码。

1. 观察者模式的基本结构

观察者模式包含以下几个角色:

- 主题(Subject):负责发布通知;

- 观察者(Observer):接收并响应通知;

- 具体主题(ConcreteSubject):继承Subject类,实现主题相关的方法;

- 具体观察者(ConcreteObserver):继承Observer类,实现观察者相关的方法。

2. 观察者模式的实现方法

实现观察者模式的具体方法有多种,以下将依次介绍。

(1)基于Java内置的观察者模式实现

在Java中,将观察者模式封装为一个标准的接口——Observer,其中定义了一个update()方法用于接收更新通知。主题实现可观察者接口——Observable,并通过它的两个方法setChanged()和notifyObservers()来发送通知。具体实现方法如下:

```

import java.util.Observable;

import java.util.Observer;

public class ConcreteSubject extends Observable {

public void setData(Object data){

setChanged();

notifyObservers(data);

}

}

public class ConcreteObserver implements Observer {

public void update(Observable o, Object arg) {

System.out.println("接收到数据:" + arg);

}

}

```

(2)基于事件模型实现

通过事件模型也可以实现观察者模式。在这种实现方法中,主题负责创建和触发事件,而观察者则通过注册监听器来获取事件。以下是一个具体实现:

```

import java.util.EventListener;

interface MyEventListener extends EventListener {

void onMyEvent(Object sender, MyEventArgs args);

}

class MyEventArgs {

private final Object data;

public Object getData() {

return data;

}

public MyEventArgs(Object data) {

this.data = data;

}

}

class MyEventSource {

private final List listeners = new ArrayList ();

public void addMyEventListener(MyEventListener listener) {

listeners.add(listener);

}

public void removeMyEventListener(MyEventListener listener) {

listeners.remove(listener);

}

public void triggerMyEvent(Object sender, MyEventArgs args) {

for (MyEventListener listener : listeners)

listener.onMyEvent(sender, args);

}

}

```

(3)基于函数式编程实现

在函数式编程中,可以使用Lambda表达式来实现观察者模式,这种实现方法更加简洁易懂。以下是一个具体实现:

```

import java.util.ArrayList;

import java.util.function.Consumer;

interface IObserver extends Consumer {}

interface IObservable {

void subscribe(IObserver observer);

}

class MyObservable implements IObservable {

private final List > observers = new ArrayList<>();

public void subscribe(IObserver observer) {

observers.add(observer);

}

public void emit(T value) {

observers.forEach(observer -> observer.accept(value));

}

}

```

3.

【关键词】观察者模式、Java、事件模型、函数式编程。

扫码咨询 领取资料


软考.png


软件设计师 资料下载
备考资料包大放送!涵盖报考指南、考情深度解析、知识点全面梳理、思维导图等,免费领取,助你备考无忧!
立即下载
软件设计师 历年真题
汇聚经典真题,展现考试脉络。精准覆盖考点,助您深入备考。细致解析,助您查漏补缺。
立即做题

软考资格查询系统

扫一扫,自助查询报考条件