当前位置: 首页 > article >正文

Java设计模式—观察者模式详解

引言

模式角色

UML图

示例代码

应用场景

优点

缺点

结论


引言

观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式非常适合实现分布式事件处理系统,如用户界面中的事件驱动机制。

模式角色
  • Subject(被观察者/主题):也称为可观察者,它包含了一个或多个观察者的引用,并提供注册、移除和通知观察者的方法。
  • Observer(观察者):定义了一个更新接口,用于接收来自被观察者的更新信息。
  • ConcreteSubject(具体的被观察者):实现了Subject接口,维护着状态,并在状态改变时通知所有已注册的观察者。
  • ConcreteObserver(具体的观察者):实现了Observer接口,当收到更新通知时执行具体的操作。
UML图
+-------------------+          +------------------+
|    Subject        |<-------->|   Observer       |
+-------------------+          +------------------+
| -observers: List  |          | + update()        |
+-------------------+          +------------------+
| + attach(observer)|
| + detach(observer)|
| + notifyObservers()|
+-------------------+
         ^
         |
         |
+-------------------+
|ConcreteSubject    |
+-------------------+
| + state           |
| + setState(state) |
+-------------------+
示例代码

以下是一个简单的Java实现示例:

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

// Observer 接口
interface Observer {
    void update(String message);
}

// ConcreteObserver 类
class ConcreteObserver implements Observer {
    private String name;

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

    @Override
    public void update(String message) {
        System.out.println(name + " received: " + message);
    }
}

// Subject 接口
interface Subject {
    void attach(Observer observer);
    void detach(Observer observer);
    void notifyObservers(String message);
}

// ConcreteSubject 类
class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String state;

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

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

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

    public void changeState(String newState) {
        this.state = newState;
        notifyObservers(newState);
    }
}

// 客户端代码
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.attach(observer1);
        subject.attach(observer2);

        subject.changeState("New State");

        subject.detach(observer1);

        subject.changeState("Updated State");
    }
}
应用场景
  • GUI事件处理:比如按钮点击事件,窗口关闭事件等。
  • 股票市场:股票价格变动可以通知订阅该股票的所有投资者。
  • 系统监控:服务器性能指标变化时通知管理员。
  • RSS订阅:博客更新时通知所有订阅者。
优点
  • 松耦合:被观察者与观察者之间是抽象耦合,两者无需知道对方的具体实现。
  • 易于扩展:添加新的观察者不需要修改现有代码,符合开闭原则。
缺点
  • 如果观察者数量过多,可能会导致性能问题。
  • 更新顺序不可控:观察者接收到的通知顺序可能无法保证。
结论

观察者模式是一种非常实用的设计模式,特别适用于需要动态地将对象关联起来的情况。通过使用这种模式,我们可以使应用程序更加灵活且易于维护。


http://www.kler.cn/a/371710.html

相关文章:

  • Java 锁机制
  • 第8天:数据存储-补充材料——MainActivity.kt解读
  • 使用Python和OpenCV实现火焰检测
  • 闭包 - 2024最新版前端秋招面试短期突击面试题【100道】
  • Django入门教程——用户管理实现
  • LeetCode15:三数之和
  • 问题排查思路
  • 记录一次mmpretrain训练数据并转onnx推理
  • 流刷新定位
  • Ubuntu24.04配置samba共享
  • 微服务的雪崩问题
  • 提问GPT
  • 流媒体协议.之(RTP,RTCP,RTSP,RTMP,HTTP)(三)
  • SpringBoot 下的Excel文件损坏与内容乱码问题
  • Zustand介绍与使用 React状态管理工具
  • Golang的跨平台开发
  • 从零到一:大学新生编程入门攻略与成长指南
  • 【flask-wtf】 表单验证器
  • Spring Boot 集成 Shiro:会话管理、加密与登录次数限制
  • 以太网交换安全:DHCP Snooping
  • 闲话10.40 :)
  • Mac安装Ruby
  • 【含开题报告+文档+PPT+源码】基于SpringBoot的体育馆管理系统的设计与实现
  • 华为应用市场增长优化(一)
  • 使用 Nginx 配置真实 IP 地址转发
  • 华为OD机试真题---狼羊过河