二十三种设计模式全面解析-当你的对象需要知道其他对象的状态变化时,观察者模式是你的救星!

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 二十三种设计模式全面解析-当你的对象需要知道其他对象的状态变化时,观察者模式是你的救星!

软件设计的世界中,有一种设计模式以其简洁而强大的特性闪耀着光芒,它就是——观察者模式(Observer Pattern)。这个模式它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,为我们创造了一种优雅的编程体验。本文将带你深入探讨,观察者模式的神秘面纱,揭示其强大之处,让你在面对复杂系统时能游刃有余。


1、什么是观察者模式

观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象发生变化时,它会通知所有的观察者对象,使它们能够自动更新自己。在观察者模式中,主题对象和观察者对象之间是松耦合的,它们之间并不直接依赖,而是通过抽象的接口或抽象类进行交互。


2、适用场景

观察者模式适用于以下场景:

  • 当一个对象的改变需要同时改变其他对象的时候。
  • 当一个对象需要将自己的改变通知其他对象,而又不希望知道具体有多少个对象需要通知时。
  • 当一个对象需要通知其他对象,但是又希望这些对象是动态的,即不需要在编译时就确定下来。

例如,一个新闻发布机构可以作为主题对象,而订阅该机构新闻的用户可以作为观察者对象。当新闻发布机构发布新闻时,所有订阅该机构新闻的用户都会收到通知。


3、技术要点

观察者模式包含以下几个核心角色:

  • 主题(Subject):维护一组观察者对象,提供注册和删除观察者对象的方法,并通知观察者对象状态变化。
  • 观察者(Observer):定义了一个更新接口,用于在主题状态变化时接收通知。
  • 具体主题(Concrete Subject):继承或实现主题接口,实现注册、删除和通知观察者对象的方法。
  • 具体观察者(Concrete Observer):继承或实现观察者接口,实现更新接口,以便在主题状态变化时更新自己的状态。


4、观察者模式案例

import java.util.ArrayList;
import java.util.List;
interface Observer {
    public void update(String message);
}
interface Subject {
    public void attach(Observer observer);
    public void detach(Observer observer);
    public void notifyObservers();
}
class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<Observer>();
    private String message;
    public void attach(Observer observer) {
        observers.add(observer);
    }
    public void detach(Observer observer) {
        observers.remove(observer);
    }
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
    public void setMessage(String message) {
        this.message = message;
        notifyObservers();
    }
}
class ConcreteObserver implements Observer {
    private String name;
    public ConcreteObserver(String name) {
        this.name = name;
    }
    public void update(String message) {
        System.out.println(name + " received message: " + message);
    }
}
public class ObserverPatternDemo {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        ConcreteObserver observer1 = new ConcreteObserver("Observer 1");
        ConcreteObserver observer2 = new ConcreteObserver("Observer 2");
        ConcreteObserver observer3 = new ConcreteObserver("Observer 3");
        subject.attach(observer1);
        subject.attach(observer2);
        subject.setMessage("Hello World!");
        subject.detach(observer2);
        subject.attach(observer3);
        subject.setMessage("Goodbye World!");
    }
}


在上面的代码中,我们定义了一个 Subject 接口和一个 Observer 接口。

Subject 接口定义了注册、删除和通知观察者的方法,而 Observer 接口定义了更新方法。


然后我们定义了一个具体的主题类 ConcreteSubject,它维护了一个观察者列表,并实现了 Subject 接口中的方法。

我们还定义了一个具体的观察者类 ConcreteObserver,它实现了 Observer 接口中的更新方法。在 ObserverPatternDemo 类中,我们创建了一个具体的主题对象 subject 和三个具体的观察者对象 observer1observer2observer3


我们首先将 observer1observer2 注册到 subject 中,然后改变 subject 的状态,这会导致 observer1observer2 的更新方法被调用。

接着我们将 observer2subject 中删除,并将 observer3 注册到 subject 中,然后再次改变 subject 的状态,这会导致 observer1observer3 的更新方法被调用。


这个案例代码展示了如何使用观察者模式来实现对象之间的松耦合,并且可以在运行时动态地选择不同的观察者,而不需要修改客户端代码。


总结:

观察者模式是一种非常有用的设计模式,它可以帮助我们实现对象之间的松耦合,让多个对象能够同时监听某一个主题对象。


然而,设计模式世界中还有许多其他精彩的故事等待我们探索。在下一篇博文中,我们将深入研究另一个引人入胜的设计模式,为你带来更多惊喜。敬请期待!


好了,今天的分享到此结束。

相关文章
|
8天前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
|
3天前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
12 3
|
15天前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
32 9
|
14天前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
26 2
|
24天前
|
设计模式 PHP 开发者
PHP中的设计模式:桥接模式的解析与应用
在软件开发的浩瀚海洋中,设计模式如同灯塔一般,为开发者们指引方向。本文将深入探讨PHP中的一种重要设计模式——桥接模式。桥接模式巧妙地将抽象与实现分离,通过封装一个抽象的接口,使得实现和抽象可以独立变化。本文将阐述桥接模式的定义、结构、优缺点及其应用场景,并通过具体的PHP示例代码展示如何在实际项目中灵活运用这一设计模式。让我们一起走进桥接模式的世界,感受它的魅力所在。
|
23天前
|
设计模式 监控 UED
设计模式之观察者模式
【10月更文挑战第12天】 观察者模式是一种行为型设计模式,定义了一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都会自动更新。主要由主题(被观察者)和观察者组成,实现对象间的松耦合,广泛应用于用户界面、事件驱动系统和数据监控等领域。
|
25天前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
本教程详细讲解Kotlin语法,适合深入学习。对于快速掌握Kotlin,推荐“简洁”系列教程。本文特别介绍了观察者模式,包括使用Java API和Kotlin委托属性(如Delegates.observable)实现的方法,旨在帮助开发者更高效地实现和优化观察者模式的应用。
31 3
|
23天前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第12天】 在软件开发的世界中,设计模式是解决常见问题的最佳实践。它们不是具体的代码,而是一种编码和设计经验的总结。在PHP开发中,合理运用设计模式可以极大地提高代码的可维护性、扩展性和复用性。本文将深入探讨策略模式(Strategy Pattern)的原理、实现方式及其在PHP中的应用。通过具体示例,我们将展示如何利用策略模式来解耦算法与对象,从而让代码更加灵活和易于管理。
16 0
|
23天前
|
设计模式 存储 安全
PHP中的设计模式:单例模式的深入解析与实践
在PHP开发中,设计模式是提高代码可维护性、扩展性和重用性的关键技术之一。本文将深入探讨单例模式(Singleton Pattern)的原理、实现方式及其在PHP中的应用,同时通过实例展示如何在具体的项目场景中有效利用单例模式来管理和组织对象,确保全局唯一性的实现和最佳实践。
|
26天前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 在PHP开发领域,设计模式是提升代码可维护性、扩展性和重用性的关键技术之一。本文聚焦于策略模式这一行为型设计模式,通过理论阐述与实例分析,揭示其在PHP应用程序中优化算法切换和业务逻辑解耦方面的强大效用。不同于常规摘要,本文不直接概述研究方法或结果,而是基于实际开发场景,探讨策略模式的应用价值和实现方式,旨在为PHP开发者提供一种高效应对复杂业务需求变化和技术债务累积问题的策略思维。

推荐镜像

更多