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

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

软件设计的世界中,有一种设计模式以其简洁而强大的特性闪耀着光芒,它就是——观察者模式(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 的更新方法被调用。


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


总结:

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


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


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

相关文章
|
20天前
|
设计模式 监控 Java
设计模式 - 观察者模式(Observer):Java中的战术与策略
【4月更文挑战第7天】观察者模式是构建可维护、可扩展系统的关键,它在Java中通过`Observable`和`Observer`实现对象间一对多的依赖关系,常用于事件处理、数据绑定和同步。该模式支持事件驱动架构、数据同步和实时系统,但需注意避免循环依赖、控制通知粒度,并关注性能和内存泄漏问题。通过明确角色、使用抽象和管理观察者注册,可最大化其效果。
|
1月前
|
设计模式 存储 Java
【设计模式】观察者模式
【设计模式】观察者模式
|
3天前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
|
10天前
|
Java API 数据库
深入解析:使用JPA进行Java对象关系映射的实践与应用
【4月更文挑战第17天】Java Persistence API (JPA) 是Java EE中的ORM规范,简化数据库操作,让开发者以面向对象方式处理数据,提高效率和代码可读性。它定义了Java对象与数据库表的映射,通过@Entity等注解标记实体类,如User类映射到users表。JPA提供持久化上下文和EntityManager,管理对象生命周期,支持Criteria API和JPQL进行数据库查询。同时,JPA包含事务管理功能,保证数据一致性。使用JPA能降低开发复杂性,但需根据项目需求灵活应用,结合框架如Spring Data JPA,进一步提升开发便捷性。
|
14天前
|
SQL Java 数据库连接
深度解析MyBatis核心:探寻其核心对象的精妙设计
深度解析MyBatis核心:探寻其核心对象的精妙设计
22 1
深度解析MyBatis核心:探寻其核心对象的精妙设计
|
15天前
|
Java 关系型数据库 MySQL
高级对象装配:解析Spring创建复杂对象的秘诀
高级对象装配:解析Spring创建复杂对象的秘诀
27 0
高级对象装配:解析Spring创建复杂对象的秘诀
|
30天前
|
设计模式 算法 中间件
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
【C++ 可调用对象的应用】C++设计模式与现代编程技巧:深入可调用对象的世界
114 1
|
1月前
|
Python
Python类与对象:深入解析与应用
本文介绍了Python中的核心概念——类和对象,以及它们在面向对象编程中的应用。类是用户定义的类型,描述具有相同属性和行为的对象集合;对象是类的实例,具备类的属性和方法。文章通过示例讲解了如何定义类、创建及使用对象,包括`__init__`方法、属性访问和方法调用。此外,还阐述了类的继承,允许子类继承父类的属性和方法并进行扩展。掌握这些概念有助于提升Python编程的效率和灵活性。
|
1月前
|
设计模式 XML SQL
C++建造者模式解析:构建复杂对象的优雅方式
C++建造者模式解析:构建复杂对象的优雅方式
39 1
C++建造者模式解析:构建复杂对象的优雅方式
|
1月前
|
存储 JSON JavaScript
Python如何解析json对象?
Python如何解析json对象?
25 1

推荐镜像

更多