魔术桌
  • 更新日志
  • 新闻资讯
  • 数据资产
  • 网站导航
  • 订阅推荐
  • 商品推广
  • 日记
  • 摘录
  • 论文
  • 方案
  • 技术
  • 风格
  • 视觉
  • 原材料
  • 加工工艺
  • 元器件
  • 产品设备
  • 设计模式
  • 数据结构
  • 算法设计
  • 软件架构
  • 程序语言
  • 代码类库
  • 操作系统
  • 软件包
  • 健康
  • 环境
  • 社会
  • 道德
  • 法律
  • 经济
  • 政策
  • 更新日志
  • 新闻资讯
  • 数据资产
  • 网站导航
  • 订阅推荐
  • 商品推广
  • 日记
  • 摘录
  • 论文
  • 方案
  • 技术
  • 风格
  • 视觉
  • 原材料
  • 加工工艺
  • 元器件
  • 产品设备
  • 设计模式
  • 数据结构
  • 算法设计
  • 软件架构
  • 程序语言
  • 代码类库
  • 操作系统
  • 软件包
  • 健康
  • 环境
  • 社会
  • 道德
  • 法律
  • 经济
  • 政策
  • DesignPattern - 观察者模式

文章摘要: 观察者模式使用总结。

简介

简要说明

  • 观察者模式(Observer Pattern)是一种行为型设计模式。
  • 允许对象(观察者)订阅另一个对象(被观察者)的状态变化,并能够在状态变化时收到通知。

主要功能

  • 在被观察者和观察者之间建立一个抽象的订阅机制。
  • 支持动态地添加和删除观察者。
  • 被观察者状态变化时,自动通知所有注册的观察者。

注意事项

  • 观察者模式可能会引起内存泄漏,如果观察者被注册后没有被正确地移除。
  • 被观察者发送通知时,如果观察者执行的操作很重,可能会影响系统的性能。

适用场景

  • 当一个抽象模型有两个方面,其中一个方面依赖于另一个方面时。
  • 当一个对象的改变需要同时改变其他对象,而不知道具体有多少对象需要改变时。
  • 当一个对象必须通知其他对象,而它又不能假定这些对象是谁时。

Java 8

案例

import java.util.ArrayList;
import java.util.List;

// 被观察者接口
interface Subject {
    // 注册观察者
    void registerObserver(Observer observer);
    // 移除观察者
    void removeObserver(Observer observer);
    // 通知所有观察者
    void notifyObservers();
}

// 观察者接口
interface Observer {
    // 当被观察者状态改变时,观察者需要更新的方法
    void update(String event);
}

// 具体的被观察者
class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String state;

    public void setState(String state) {
        this.state = state;
        // 状态改变时,通知所有观察者
        notifyObservers();
    }

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

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

    @Override
    public void notifyObservers() {
        // 通知所有注册的观察者
        for (Observer observer : observers) {
            observer.update(state);
        }
    }
}

// 具体的观察者
class ConcreteObserver implements Observer {
    private String name;

    public ConcreteObserver(String name) {
        this.name = name;
    }

    @Override
    public void update(String event) {
        // 观察者接收到通知后的行为
        System.out.println(name + " received event: " + event);
    }
}

// 客户端代码
public class ObserverPatternDemo {
    public static void main(String[] args) {
        // 创建被观察者
        ConcreteSubject subject = new ConcreteSubject();

        // 创建观察者
        Observer observer1 = new ConcreteObserver("Observer 1");
        Observer observer2 = new ConcreteObserver("Observer 2");

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

        // 改变被观察者的状态,这将触发通知
        subject.setState("State changed!");
    }
}

注释

  • 在这个例子中,Subject接口定义了注册、移除和通知观察者的方法。Observer接口定义了观察者接收通知的方法update。
  • ConcreteSubject类是具体的被观察者,它维护了一个观察者列表,并在状态改变时通知这些观察者。ConcreteObserver类是具体的观察者,它在接收到状态变化的通知时执行相应的操作。
  • 在客户端代码ObserverPatternDemo中,我们创建了被观察者和两个观察者,并将观察者注册到被观察者中。当被观察者的状态改变时,所有注册的观察者都会收到通知,并执行它们的update方法。
更新时间: 2025/10/3 17:56