行为型模式之观察者模式

观察者模式(Observer Pattern)

观察者模式是一种行为设计模式,用于建立对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会自动收到通知并更新。
在观察者模式中,有两类角色:被观察者(也称为主题或可观察者)和观察者。

被观察者维护了一个观察者列表,并提供了注册、注销和通知观察者的方法。观察者通过注册自己来订阅被观察者的状态变化。

当被观察者的状态发生改变时,它会遍历观察者列表并调用各个观察者的相应方法来通知它们。
观察者模式的优点包括松耦合、可扩展性好,被观察者与观察者之间的关系可以动态建立和解除。它常被用于事件驱动系统,

例如GUI界面的事件处理、发布-订阅模式等。

需要注意的是,在具体实现观察者模式时,要确保避免循环引用和过度依赖观察者之间的耦合。

提供demo版代码更容易理解

java 复制代码
/**
 * @author zhou
 *  观察者接口
 */
interface Observer {
    void update(String data);
}

/**
 * @author zhou
 *  被观察者接口
 */
interface Observable {
    // 注册
    void registerObserver(Observer observer);
    // 注销
    void unregisterObserver(Observer observer);
    // 通知
    void notifyObservers(String data);
}

/**
 * @author zhou
 *  具体的观察者类
 */
class ConcreteObserver implements Observer {
    @Override
    public void update(String data) {
        System.out.println("Received data: " + data);
    }
}

/**
 * @author zhou
 *  具体的被观察者类
 */
class ConcreteObservable implements Observable {
    private List<Observer> observers;

    public ConcreteObservable() {
        observers = new ArrayList<>();
    }

    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void unregisterObserver(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers(String data) {
        for (Observer observer : observers) {
            observer.update(data);
        }
    }

    public void doSomething() {
        // 做一些操作...
        String data = "Some data";
        notifyObservers(data);
    }
}

/**
 * @author zhou
 *  客户端使用
 */
public class Main {
    public static void main(String[] args) {
        ConcreteObservable observable = new ConcreteObservable();
        Observer observer1 = new ConcreteObserver();
        Observer observer2 = new ConcreteObserver();

        // 注册观察者
        observable.registerObserver(observer1);
        observable.registerObserver(observer2);

        // 调用被观察者的方法,会通知观察者并执行相应的更新操作
        observable.doSomething();

        // 取消注册一个观察者
        observable.unregisterObserver(observer2);

        // 再次调用被观察者的方法
        observable.doSomething();
    }
}

在这个示例中,Observer 接口是观察者的接口,其中定义了 update 方法来接收被观察者传递的数据。

Observable 接口是被观察者的接口,其中包含了注册、注销和通知观察者的方法。

ConcreteObserver 类是具体的观察者类,实现了 Observer 接口的 update 方法,用于处理被观察者传递的数据。

ConcreteObservable 类是具体的被观察者类,实现了 Observable 接口的方法。

它内部维护了一个观察者列表,并在操作时调用 notifyObservers 方法通知所有注册的观察者。
在示例的 Main 类中,首先创建了一个具体的被观察者对象 observable,

然后创建了多个具体的观察者对象 (observer1 和 observer2),并将它们注册到被观察者对象中。

随后调用被观察者的 doSomething 方法,触发通知过程,观察者接收到数据并进行相应的更新操作。

相关推荐
汤姆和杰瑞在瑞士吃糯米粑粑5 分钟前
【C++学习篇】AVL树
开发语言·c++·学习
J不A秃V头A11 分钟前
IntelliJ IDEA中设置激活的profile
java·intellij-idea
Biomamba生信基地13 分钟前
R语言基础| 功效分析
开发语言·python·r语言·医药
DARLING Zero two♡13 分钟前
【优选算法】Pointer-Slice:双指针的算法切片(下)
java·数据结构·c++·算法·leetcode
手可摘星河15 分钟前
php中 cli和cgi的区别
开发语言·php
小池先生24 分钟前
springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失
java·spring boot·后端
CodeClimb28 分钟前
【华为OD-E卷-木板 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
odng30 分钟前
IDEA自己常用的几个快捷方式(自己的习惯)
java·ide·intellij-idea
CT随38 分钟前
Redis内存碎片详解
java·开发语言
brrdg_sefg1 小时前
gitlab代码推送
java