23种设计模式,观察者模式的概念优缺点以及JAVA代码举例

简介: 【4月更文挑战第9天】观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。

观察者模式(Observer Pattern)

观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。

概念

  • 主题(Subject):维护一系列观察者,提供用于增加或删除观察者的方法。
  • 观察者(Observer):为那些在主题状态发生改变时需获得通知的对象定义一个更新接口。
  • 具体主题(Concrete Subject):在状态发生改变时,向其注册的观察者发出通知。
  • 具体观察者(Concrete Observer):实现观察者接口,以便在主题状态改变时更新自己的状态。

优点

  1. 支持广播通信:观察者模式允许消息的广播,便于实现一对多的通信。
  2. 实现了主题和观察者之间的抽象耦合:主题只知道观察者列表,不需要知道具体的观察者,便于扩展。
  3. 支持即时或延迟通知:观察者可以即时获得状态改变的通知,或根据需要延迟处理。

缺点

  1. 可能会导致无意的循环引用:观察者和主题之间的复杂依赖关系可能会导致循环引用问题,增加系统复杂性。
  2. 如果观察者响应不当,可能会导致错误或性能问题:观察者的处理函数出错或处理时间过长,会影响整个系统的效率和稳定性。

Java代码示例

假设我们有一个简单的股票价格更新系统,其中的价格更新会通知所有注册的观察者。

java复制代码

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

// 主题接口
interface Subject {
    void attach(Observer observer);
    void detach(Observer observer);
    void notifyUpdate(Message m);
}

// 观察者接口
interface Observer {
    void update(Message m);
}

// 具体主题
class StockTicker implements Subject {
    private final List<Observer> observers = new ArrayList<>();

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

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

    public void notifyUpdate(Message m) {
        for (Observer observer : observers) {
            observer.update(m);
        }
    }
}

// 具体观察者
class PriceDisplay implements Observer {
    public void update(Message m) {
        System.out.println("PriceDisplay: " + m.getContent());
    }
}

class Message {
    private final String content;

    public Message(String content) {
        this.content = content;
    }

    public String getContent() {
        return content;
    }
}

// 客户端代码
public class ObserverDemo {
    public static void main(String[] args) {
        StockTicker ticker = new StockTicker();
        PriceDisplay display = new PriceDisplay();

        ticker.attach(display);
        ticker.notifyUpdate(new Message("AAPL 150.50"));
        ticker.notifyUpdate(new Message("GOOGL 1200.30"));
    }
}

在这个例子中,StockTicker 类是具体主题,它维护一个观察者列表并通知它们状态的改变。PriceDisplay 类是具体观察者,它实现了 Observer 接口,并在接收到更新通知时展示股票价格。这样,股票价格的任何更新都会自动通知给 PriceDisplay,实现了数据与视图的分离。

相关文章
|
2天前
|
Java 测试技术
如何提高Java代码的可读性
Java是一种常用的编程语言,但是写出易懂且可读性高的代码却是一项挑战。本文将分享一些技巧和建议,帮助您提高Java代码的可读性和可维护性。
|
4天前
|
设计模式 Java
Java一分钟之-设计模式:观察者模式与事件驱动
【5月更文挑战第17天】本文探讨了Java中实现组件间通信的观察者模式和事件驱动编程。观察者模式提供订阅机制,当对象状态改变时通知所有依赖对象。然而,它可能引发性能问题、循环依赖和内存泄漏。代码示例展示了如何实现和避免这些问题。事件驱动编程则响应用户输入和系统事件,但回调地狱和同步/异步混淆可能造成困扰。JavaFX事件驱动示例解释了如何处理事件。理解这两种模式有助于编写健壮的程序。
10 1
|
5天前
|
Java Kotlin
java调用kotlin代码编译报错“找不到符号”的问题
java调用kotlin代码编译报错“找不到符号”的问题
17 10
|
6天前
|
设计模式 安全 Java
【设计模式】字节三面:请举例阐释访问者模式
【设计模式】字节三面:请举例阐释访问者模式
9 2
|
6天前
|
前端开发 Java Spring
Java Web ——MVC基础框架讲解及代码演示(下)
Java Web ——MVC基础框架讲解及代码演示
13 1
|
6天前
|
设计模式 前端开发 网络协议
Java Web ——MVC基础框架讲解及代码演示(上)
Java Web ——MVC基础框架讲解及代码演示
8 0
|
6天前
|
设计模式 JavaScript 前端开发
js设计模式-观察者模式与发布/订阅模式
观察者模式和发布/订阅模式是JavaScript中的两种设计模式,用于处理对象间的通信和事件处理。观察者模式中,一个主题对象状态改变会通知所有观察者。实现包括定义主题和观察者对象,以及在主题中添加、删除和通知观察者的功能。发布/订阅模式则引入事件管理器,允许发布者发布事件,订阅者通过订阅接收通知。
|
6天前
|
设计模式 API
【设计模式】适配器和桥接器模式有什么区别
【设计模式】适配器和桥接器模式有什么区别
10 1
|
6天前
|
设计模式
【设计模式】张一鸣笔记:责任链接模式怎么用?
【设计模式】张一鸣笔记:责任链接模式怎么用?
11 1
|
6天前
|
设计模式 uml
【设计模式】建造者模式就是游戏模式吗?
【设计模式】建造者模式就是游戏模式吗?
11 0