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

本文涉及的产品
公共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 的更新方法被调用。


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


总结:

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


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


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

相关文章
|
3天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
3天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
3天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
3天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
3天前
|
设计模式 Java 程序员
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
本系列文章聚焦于面向对象软件设计中的设计模式,旨在帮助开发人员掌握23种经典设计模式及其应用。内容分为三大部分:第一部分介绍设计模式的概念、UML图和软件设计原则;第二部分详细讲解创建型、结构型和行为型模式,并配以代码示例;第三部分通过自定义Spring的IOC功能综合案例,展示如何将常用设计模式应用于实际项目中。通过学习这些内容,读者可以提升编程能力,提高代码的可维护性和复用性。
【23种设计模式·全精解析 | 概述篇】设计模式概述、UML图、软件设计原则
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
77 2
|
2月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
81 0
|
2月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
66 0
|
2月前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
70 0
|
2月前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
92 0

热门文章

最新文章

推荐镜像

更多