行为型模式之观察者模式

观察者模式(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 方法,触发通知过程,观察者接收到数据并进行相应的更新操作。

相关推荐
周GZ20 分钟前
简单讲解Java中静态方法与 实例方法
java·开发语言
疯狂打码的少年30 分钟前
【数据结构】树的基本概念与二叉树定义
java·数据结构·笔记·算法
盗理者1 小时前
AI Agent 技能分享|SQL 性能诊断与优化
java·sql·spring·skill
GitLqr1 小时前
Java 26 终于原生支持 HTTP/3 了:告别 Netty,直接用 QUIC
java·netty·http3
用户40966601317511 小时前
Jackson 序列化:@JsonIgnore / @JsonProperty / @JsonFormat / @JsonInclude / @JsonUnwrapped 一次讲清楚
java·后端
码路漫漫1 小时前
用了 Caffeine,消息为什么还是被处理了两次?
java
云和数据.ChenGuang2 小时前
fastapi项目拆分实战数据模型
java·服务器·数据库·人工智能·深度学习·fastapi·强化学习
大白同学4212 小时前
初识Qt——创建第一个Qt项目
开发语言·qt
祈禾2 小时前
计算机组成原理之编译、汇编、链接、解释
开发语言·汇编·笔记·学习
吴声子夜歌2 小时前
正则指引——Ruby
开发语言·正则表达式·ruby