行为型模式之观察者模式

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

相关推荐
lqjun08271 小时前
Qt程序单独运行报错问题
开发语言·qt
hdsoft_huge3 小时前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot
风中的微尘3 小时前
39.网络流入门
开发语言·网络·c++·算法
雨白3 小时前
Java 多线程指南:从基础用法到线程安全
android·java
Hungry_Shark4 小时前
IDEA版本控制管理之使用Gitee
java·gitee·intellij-idea
赛姐在努力.4 小时前
《IDEA 突然“三无”?三秒找回消失的绿色启动键、主菜单和项目树!》
java·intellij-idea
未来之窗软件服务4 小时前
幽冥大陆(二)RDIFSDK 接口文档:布草洗涤厂高效运营的技术桥梁C#—东方仙盟
开发语言·c#·rdif·仙盟创梦ide·东方仙盟
猎板PCB黄浩4 小时前
从废料到碳减排:猎板 PCB 埋容埋阻的绿色制造革命,如何实现环保与性能双赢
java·服务器·制造
ZzzK,4 小时前
JAVA虚拟机(JVM)
java·linux·jvm
西红柿维生素4 小时前
JVM相关总结
java·jvm·算法