一起来学设计模式之观察者模式

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 前言目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~本节给大家讲一下设计模式中的观察者模式,并结合实际业务场景给大家讲解如何使用~本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~观察者模式观察者模式是一种设计模式,用于在对象间建立一对多的依赖关系,使得一个对象的状态发生变化时,其所有依赖对象都会收到通知并自动更新。这种模式包含了两种类型的对象:主题(Subject)和观察者(Observer)。主题对象会在状态发生变化时通知所有注册的观察者对象,观察者接受到通知后会自动更新自己。

前言

目前正在出一个设计模式专题系列教程, 篇幅会较多, 喜欢的话,给个关注❤️ ~

本节给大家讲一下设计模式中的观察者模式,并结合实际业务场景给大家讲解如何使用~

本专题的所有案例代码主要以Java语言为主, 好了, 废话不多说直接开整吧~

观察者模式

观察者模式是一种设计模式,用于在对象间建立一对多的依赖关系,使得一个对象的状态发生变化时,其所有依赖对象都会收到通知并自动更新。这种模式包含了两种类型的对象:主题(Subject)观察者(Observer)。主题对象会在状态发生变化时通知所有注册的观察者对象,观察者接受到通知后会自动更新自己。

首先,我们定义主题接口Subject和观察者接口Observer

public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}
public interface Observer {
    void update(int value);
}

接下来,我们定义一个具体的主题类CounterSubject,它实现了Subject接口,并包含了计数器的值和一个Observer列表。这个类在计数器变化时会通知所有注册的观察者:

public class CounterSubject implements Subject {
    private int value;
    private ArrayList<Observer> observers;
    public CounterSubject() {
        observers = new ArrayList<Observer>();
    }
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(value);
        }
    }
    public void setValue(int newValue) {
        value = newValue;
        notifyObservers();
    }
    public int getValue() {
        return value;
    }
}

最后,我们定义了一个具体的观察者类CounterObserver,它实现了Observer接口,并在主题状态发生变化时更新自己:

public class CounterObserver implements Observer {
    private int value;
    public void update(int value) {
        this.value = value;
        System.out.println("CounterObserver: Value changed to " + value);
    }
}

现在我们可以使用这些类来创建一个简单的观察者模式示例。首先,我们创建一个CounterSubject实例,并注册两个CounterObserver实例:

public class ObserverDemo {
    public static void main(String[] args) {
        CounterSubject subject = new CounterSubject();
        CounterObserver observer1 = new CounterObserver();
        CounterObserver observer2 = new CounterObserver();
        subject.registerObserver(observer1);
        subject.registerObserver(observer2);
        subject.setValue(10); // Output: CounterObserver: Value changed to 10
        subject.setValue(20); // Output: CounterObserver: Value changed to 20
    }
}

最佳实践

当电商平台上新商品或促销活动时,可能会有许多用户需要收到通知,并在他们的页面上看到这些新商品或促销活动。这时,我们可以使用观察者模式来实现这个功能。在这种情况下,主题是电商平台,观察者是用户。

首先,我们定义主题接口Subject和观察者接口Observer

public interface Observer {
    void update(String message);
}
public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers(String message);
}

然后,我们定义一个具体的主题类EcommercePlatform,它实现了Subject接口,并包含了用户的列表。这个类在有新商品或促销活动时会通知所有注册的观察者:

public class EcommercePlatform implements Subject {
    private ArrayList<Observer> observers;
    public EcommercePlatform() {
        observers = new ArrayList<Observer>();
    }
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
    public void notifyUsers(String message) {
        notifyObservers(message);
    }
}

最后,我们定义一个具体的观察者类User,它实现了Observer接口,并在主题状态发生变化时更新自己:


public class User implements Observer {
    private String name;
    public User(String name) {
        this.name = name;
    }
    public void update(String message) {
        System.out.println("User " + name + " received message: " + message);
    }
}

现在我们可以使用这些类来创建一个简单的观察者模式示例。首先,我们创建一个EcommercePlatform实例,并注册两个User实例:

public class Demo {
    public static void main(String[] args) {
        EcommercePlatform ecommercePlatform = new EcommercePlatform();
        User user1 = new User("小明");
        User user2 = new User("小红");
        ecommercePlatform.registerObserver(user1);
        ecommercePlatform.registerObserver(user2);
        ecommercePlatform.notifyUsers("New products on sale!");
//        User 小明 received message: New products on sale!
//        User 小红 received message: New products on sale!
    }
}

在实际应用中,观察者模式可以用于构建更复杂的系统,例如消息推送和实时数据更新等。

结束语

设计模式其实并不难,大家在学习的时候一定要在理解的基础上去写代码,不要去背代码。下节给大家讲状态模式~

本着把自己知道的都告诉大家,如果本文对您有所帮助,点赞+关注鼓励一下呗~

相关文章

项目源码(源码已更新 欢迎star⭐️)

Kafka 专题学习

项目源码(源码已更新 欢迎star⭐️)

ElasticSearch 专题学习

项目源码(源码已更新 欢迎star⭐️)

往期并发编程内容推荐

推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)

博客(阅读体验较佳)







 

相关文章
|
15天前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
|
1月前
|
设计模式 传感器
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
【设计模式】观察者模式(定义 | 特点 | Demo入门讲解)
39 0
|
10天前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
21 3
|
22天前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
33 9
|
21天前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
27 2
|
30天前
|
设计模式 监控 UED
设计模式之观察者模式
【10月更文挑战第12天】 观察者模式是一种行为型设计模式,定义了一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都会自动更新。主要由主题(被观察者)和观察者组成,实现对象间的松耦合,广泛应用于用户界面、事件驱动系统和数据监控等领域。
|
1月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
本教程详细讲解Kotlin语法,适合深入学习。对于快速掌握Kotlin,推荐“简洁”系列教程。本文特别介绍了观察者模式,包括使用Java API和Kotlin委托属性(如Delegates.observable)实现的方法,旨在帮助开发者更高效地实现和优化观察者模式的应用。
32 3
|
2月前
|
设计模式 Java 关系型数据库
设计模式——观察者模式
观察者模式介绍、观察者模式优化天气预报案例、JDK 的Observable类和Observer类
设计模式——观察者模式
|
1月前
|
设计模式 监控 Java
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
Kotlin教程笔记(52) - 改良设计模式 - 观察者模式
28 0
|
3月前
|
设计模式 存储 前端开发
【十四】设计模式~~~行为型模式~~~观察者模式(Java)
文章详细介绍了观察者模式(Observer Pattern),这是一种对象行为型模式,用于建立对象之间的一对多依赖关系。当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。文中通过交通信号灯与汽车的案例以及多人联机对战游戏的设计方案,阐述了观察者模式的动机和应用场景。接着,文章介绍了观察者模式的结构、角色、优点、缺点以及适用情况,并通过代码示例展示了如何在Java中实现观察者模式。此外,还探讨了观察者模式在MVC架构中的应用以及Java中对观察者模式的支持。
【十四】设计模式~~~行为型模式~~~观察者模式(Java)

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    42
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    46
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    54
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    62
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    57
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    41
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    106
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78