设计模式之观察者模式

简介: 本篇文章是设计模式专题的第十篇文章,我会将遇到的设计模式都一一总结在该专题下,我会把自己对每一种设计模式的感悟写下来,以及在实际工作中我们该如何去灵活应用这些设计模式,欢迎大家关注。本篇文章我们就来讲一讲,能够帮助我们实现事件驱动的观察者模式。

观察者模式的简单介绍

观察者模式简单的来说就是当一个对象发生改变就会触发另一个对象触发改变,这是一种典型的行为型模式。

在之前的文章中我们介绍过基于事件驱动的编程,观察者模式就是一种典型的基于事件驱动的编程模型。

观察者模式的类图:

image.png

观察者模式中各个角色的介绍:

  • 抽象主题角色:抽象主题可以用于维护各个注册进来的观察者,以及主题的状态
  • 具体主题角色:用于实现抽象主题中的通知方法,当具体主题中的状态发生变化时,通知所有注册过的
  • 抽象的观察者:一类观察者的抽象
  • 具体的观察者:实现抽象观察者中定义的方法,以便得到主题通知后进行相应的操作

观察者模式的具体实现思路

  • 抽象主题的创建
  • 具体主题创建,实现通知方式
  • 抽象观察者的创建,注意在对象内部发生变的时候需要触发通知方法
  • 具体观察者得到通知后,做不同的操作

观察者模式的具体实现方案

//抽象主题
public abstract class Subject {
    // 注册到该主题的观察者
    private List<Observer> observers = new ArrayList<Observer>();
    // 状态
    private int state;
    
    // 注册观察者方法
    public void add(Observer observer) {
        observers.add(observer);
    }
    // 移除观察者方法
    public void remove(Observer observer) {
        observers.remove(observer);
    }
        
    public int getState() {
        return state;
    }
    // 状态发生变化时,触发通知 
    public void setState(int state) {
        this.state = state;
        notifyAllObservers();
    }
    // 通知所有注册进来观察者的方法
    public abstract void notifyAllObservers(); 
}
// 具体主题
public class ConcreteSubject extends Subject {
    
    public void notifyAllObservers() {       
        for (Observer observer : observers) {
            observer.response();
        }
    }
}
// 抽象观察者
public interface Observer {
    // 观察者的反应
    void response(); 
}
// 具体观察者1
public class ConcreteObserver1 implements Observer {
    
    public void response() {
        System.out.println("具体观察者1作出反应!");
    }
}
// 具体观察者1
public class ConcreteObserver2 implements Observer {
    
    public void response() {
        System.out.println("具体观察者2作出反应!");
    }
}

观察者模式的优缺点

优点

  • 主题与观察者之间是松耦合的
  • 能够灵活的通过主题触发各个观察者,做对应操作
  • 支持一对多

缺点

  • 观察目标(主题)通知观察者(大量的观察者,或者观察者操作比较复杂)需要耗费较长的时间
  • 观察者和观察目标(主题)之间有循环依赖的话,会导致系统奔溃
  • 观察者只能知道观察目标发生了变化,但是无法得知怎么发生变化的。

观察者模式的适用场景

  1. 对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。
  2. 不需要知道具体观察者是谁,只需分发通知,系统中感兴趣的对象会自动注册,接收该通知。
  3. 需要在系统中建立触发链,形成一种链式触发机制,使得事件具备跨域(跨越两种观察者类型)通知。

观察者模式总结

观察者模式也是一种主题订阅模式,感兴趣的观察者去订阅主题,主题发生变化,会自动对各个观察者进行通知。这样我们就可以将一些业务逻辑的触,交由一些事件去触发,这也就形成了事件驱动。对事件驱动感兴趣的可以阅读我的这一篇文章https://juejin.cn/post/7030066612162002974,事件驱动对于我们进行程序设计有很大的指导作用,应用也非常广泛。

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

热门文章

最新文章

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