当前位置: 首页 > article >正文

设计模式-观察者模式(代码实现、源码级别应用、使用场景)

提示:观察者模式的代码实现、观察者模式的使用场景、观察者模式源码级别的应用、观察者模式的优点、

文章目录

  • 前言
  • 一、定义
  • 二、类图
  • 三、代码实现
  • 四、应用场景
  • 五、源码级别的应用
  • 总结


前言

随着时间的推移,我现在越来越感觉自己的代码不够优雅了,相信有一部分博友跟我有同样的困扰,因此决定再学习记录一下相关的设计模式。今天就介绍一下设计模式-观察者模式


一、定义

模式定义:定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,他的所有依赖者都会收到通知并更新。

二、类图

在这里插入图片描述

  • 其中subject 代表着主题对象。subject中的attach代表着添加观察者的方法(需要观察这个对象的时候加进来,不需要的时候移除)、detach代表着删除观察者的方法(不感兴趣的时候可以移除这个观察者)、notify代表着观察着发生变化的方法。
  • observer代表着观察着对象。他的update方法,就是主题对象改变了以后,观察者对象要改变的方法

三、代码实现

代码如下:

package com.zheng.observer;

import java.util.ArrayList;
import java.util.List;

/**
 * @author: ztl
 * @date: 2024/09/19 22:20
 * @desc: 观察着模式,测试类
 */
public class ObserverTest {

    public static void main(String[] args) {
        MySuject subject = new MySuject();
        TaskAObserver taskAObserver = new TaskAObserver();
        TaskBObserver taskBObserver = new TaskBObserver();
        subject.addObserver(taskAObserver);
        subject.addObserver(taskBObserver);

//        subject.notifyObserver("被观察的对象发生了改变"); // TaskAObserver start  TaskBObserver start
        subject.removeObserver(taskBObserver);
        // 把B的task从监听的中去掉了,所以只有a继续观察了
        subject.notifyObserver("被观察的对象发生了改变"); // TaskAObserver start
    }
}

/**
 * 定义一个类,这个就是被观察的对象
 */
class MySuject{
    // 容器(也就是所有观察这个对象的观察者)
    private List<MyObserver> list = new ArrayList<>();
    // add
    public void addObserver(MyObserver myObserver){
        list.add(myObserver);
    }
    // remove
    public void removeObserver(MyObserver myObserver){
        list.remove(myObserver);
    }
    // 具体的改变方法,就是被观察的对象发生改变的方法,
    public void notifyObserver(Object object){
        for (MyObserver myObserver : list){
            myObserver.update();
        }
    }
}

/**
 * 观察者模式的接口,他下面可以有多少实现
 */
interface MyObserver{
    void update();
}

/**
 * 观察者的第一个实现类
 */
class TaskAObserver implements MyObserver{

    @Override
    public void update() {
        System.out.println("TaskAObserver start");
    }
}

/**
 * 观察者的第二个实现类
 */
class TaskBObserver implements MyObserver{

    @Override
    public void update() {
        System.out.println("TaskBObserver start");
    }
}

四、应用场景

当更改一个对象的状态可能需要更改其他对象,并且实际的对象集事先未知或动态更改时,倾使用观察者模式

优点:
1.符合开闭原则
2.可以在运行时简历对象之间的关系

五、源码级别的应用

JDK中:
java util.Observable;

Spring中:
org.springframework.context.ApplicationListener

总结

今天跟媳妇儿聊天的时候,就随口一提:现在看spring源码看的我瞌睡,昏昏沉沉的。媳妇儿问我,那你之前不困吗?我答:不,我之前不看源码(手动狗头)


http://www.kler.cn/a/377518.html

相关文章:

  • 金箍棒变化-第15届蓝桥杯国赛Scratch初/中级组真题第1题
  • springboot - 定时任务
  • 深入Pillow:处理图像下载中的意外挑战
  • 【优选算法 — 双指针】双指针小专题
  • 【案例】故障雪花屏
  • leetcode-有效的字母异位词
  • R6:LSTM实现糖尿病探索与预测
  • 中药大数据(四):数据预处理+管理端的功能实现
  • linux-valgrind检测分析C/C++程序(三)
  • 4. STM32之TIM实验--输出比较(PWM输出,电机,四轴飞行器,智能车,机器人)--(实验2:PWM驱动舵机)
  • Java方法的使用
  • MP4650模块改为固定电压记录
  • 【C++】深入理解 C++ 输入输出同步机制:为什么 cin/cout 没有 scanf/printf 快?
  • Java: 遍历 Map
  • Ubuntu编译linux内核指南(适用阿里云、腾讯云等远程服务器;包括添加Android支持)
  • golang有序map
  • vue3 + ts + element-plus 二次封装 el-table
  • ✨ Midjourney中文版:创意启航,绘梦无界 ✨
  • Harmony NEXT - AlphabetIndexer实现联系人字母索引
  • 密码学简介
  • Python入门:如何掌控多线程数量
  • 【OD-支持在线评测】智能驾驶(200分)
  • 无人机之自动控制原理篇
  • oracle-函数-NULLIF (expr1, expr2)的妙用
  • Vuestic 数据表格 使用demo
  • HTML前端页面设计静态网站