观察者模式与泛型上界:设计思想与灵活应用的完美结合

news2024/12/27 2:28:08

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

目录

  • 👋 前言
  • 🌱 泛型上界与通配符上界初探
    • 📌 什么是泛型上界?
    • 📌 通配符上界的概念与使用
  • 👁️ 观察者模式简介
    • 🔍 观察者模式的基本思想
    • 🔄 观察者模式的场景与应用
  • 💡 泛型与观察者模式的完美结合
    • 🛠️ 泛型上界在观察者模式中的应用
    • 🎯 示例:使用泛型和观察者模式创建一个通知系统
  • 🎉 拓展延伸:使用泛型和观察者模式提升代码复用性
  • 📝 总结与个人感悟

👋 前言

嗨!编程的小伙伴们,今天我们来聊聊两个看似“风马牛不相及”的话题——观察者模式泛型上界与通配符上界。或许你会问,这两个概念放在一起能干什么?别急,我们会从泛型的基础出发,谈到观察者模式的设计思想,最终结合泛型上界的应用,看看如何在实际项目中实现一个灵活的通知系统。希望大家阅读时能轻松理解并有所收获!


🌱 泛型上界与通配符上界初探

📌 什么是泛型上界?

在 Java 中,泛型是一个强大的工具,它帮助我们编写更加通用、灵活且类型安全的代码。但是,泛型类型有时需要设置一个“上界”(Upper Bound),以限制泛型所能接受的类型范围。通过这种方式,我们可以指定泛型必须属于某个类型的子类,从而实现更精确的类型控制。

例如,我们可以在泛型声明中使用上界来确保某个类型参数属于 Number 的子类:

public class DataProcessor<T extends Number> {
    private T data;

    public DataProcessor(T data) {
        this.data = data;
    }

    public double process() {
        return data.doubleValue() * 2;
    }
}

在这个例子中,T 只能是 Number 或其子类,这样我们可以确保 data 能够调用 doubleValue() 方法。

📌 通配符上界的概念与使用

泛型上界的概念可以进一步扩展到通配符。通配符通常用 ? 表示,并允许我们在泛型参数不确定的情况下,灵活地指定参数类型的范围。比如 ? extends Number 表示“任何继承自 Number 的类型”。

通配符上界的一个典型场景是限制集合中的元素类型:

public void printNumbers(List<? extends Number> numbers) {
    for (Number number : numbers) {
        System.out.println(number.doubleValue());
    }
}

通过这种方式,我们可以在方法中接收任何类型的 Number 子类的 List,而不用具体指定 IntegerDouble 等。


👁️ 观察者模式简介

🔍 观察者模式的基本思想

观察者模式(Observer Pattern)是行为型设计模式之一,它主要用于定义对象之间的“一对多”依赖关系。当一个对象的状态发生改变时,它会自动通知所有依赖于它的对象。这些对象可以根据通知的内容自行更新。

简单来说,观察者模式的核心在于“观察”与“通知”机制:观察者(Observer)在关注某个对象(主题/被观察者)的状态,当状态变化时,主题就会通知所有观察者,让它们做出相应的反应。这样的设计广泛应用于事件监听、数据变化通知等场景中。

🔄 观察者模式的场景与应用

观察者模式在许多场景下都非常实用。例如,订阅-发布系统、消息通知系统、GUI 事件监听、股票价格更新等。任何需要在一处发生变化后通知多个其他模块的系统都可以考虑使用观察者模式。

在 Java 中,观察者模式的经典实现通常包括两个角色:

  1. Subject(主题/被观察者):负责注册、删除和通知观察者。
  2. Observer(观察者):实现接收通知后的相应操作。

💡 泛型与观察者模式的完美结合

泛型的灵活性与观察者模式的扩展性相结合,可以使得观察者模式变得更加通用和灵活。通过泛型上界,我们可以确保观察者对象的类型安全,而通配符上界的引入则能增强观察者模式的适用性。

🛠️ 泛型上界在观察者模式中的应用

在观察者模式中,我们可以使用泛型上界来定义观察者,使其能够接受指定类型的消息。这样一来,无论是字符串消息还是数字消息,我们的观察者都能安全地处理。

🎯 示例:使用泛型和观察者模式创建一个通知系统

我们通过一个简化的消息通知系统来演示如何结合泛型上界和观察者模式。这套系统中,主题可以发布不同类型的消息,而观察者只接收符合其上界约束的消息类型。

定义一个泛型的 Subject 类
import java.util.ArrayList;
import java.util.List;

public class Subject<T> {
    private List<Observer<? super T>> observers = new ArrayList<>();

    public void addObserver(Observer<? super T> observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer<? super T> observer) {
        observers.remove(observer);
    }

    public void notifyObservers(T message) {
        for (Observer<? super T> observer : observers) {
            observer.update(message);
        }
    }
}
定义 Observer 接口
public interface Observer<T> {
    void update(T message);
}
实现具体的 Observer
public class StringObserver implements Observer<String> {
    @Override
    public void update(String message) {
        System.out.println("String Observer received: " + message);
    }
}

public class NumberObserver implements Observer<Number> {
    @Override
    public void update(Number message) {
        System.out.println("Number Observer received: " + message);
    }
}
测试代码
public class Main {
    public static void main(String[] args) {
        Subject<String> stringSubject = new Subject<>();
        stringSubject.addObserver(new StringObserver());

        stringSubject.notifyObservers("Hello Observers!");

        Subject<Number> numberSubject = new Subject<>();
        numberSubject.addObserver(new NumberObserver());

        numberSubject.notifyObservers(42);
    }
}

在这个示例中,StringObserver 只接收字符串类型的消息,而 NumberObserver 则接收数字类型的消息。通过泛型上界,我们可以保证观察者接收到的消息类型符合预期。


🎉 拓展延伸:使用泛型和观察者模式提升代码复用性

  1. 提高代码的灵活性:结合泛型和通配符上界,观察者模式可以实现类型安全的多样化通知系统,极大地增强了代码的复用性。
  2. 应对变化需求:随着业务的增长,系统可能需要支持更多类型的通知。泛型上界的加入能够让我们的通知系统应对更广泛的消息类型。

例如,当需要增加一个处理浮点数的观察者时,我们可以直接在原有系统上扩展而不需要大幅修改代码。


📝 总结与个人感悟

观察者模式和泛型上界看似是两个独立的概念,但结合在一起之后,能够帮助我们构建一个通用且灵活的通知系统。观察者模式提供了对象间的解耦机制,而泛型上界的引入又能确保类型安全性和代码复用性。这种设计思想不仅在实际项目中非常实用,也使我们能够更加深刻地理解面向对象编程的思想。

希望这篇文章能让你更轻松地理解泛型上界和观察者模式的结合应用,帮助你在项目中打造更加灵活且高效的系统!

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2252029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Cesium 当前位置矩阵的获取

Cesium 位置矩阵的获取 在 3D 图形和地理信息系统&#xff08;GIS&#xff09;中&#xff0c;位置矩阵是将地理坐标&#xff08;如经纬度&#xff09;转换为世界坐标系的一种重要工具。Cesium 是一个强大的开源 JavaScript 库&#xff0c;用于创建 3D 地球和地图应用。在 Cesi…

网络编程项目1

基于TCP通信控制红色机械臂和蓝色机械臂的运作 1、项目要求&#xff1a;通过w&#xff08;红色臂角度增大&#xff09;s&#xff08;红色臂角度减小&#xff09;d&#xff08;蓝色臂角度增大&#xff09;a&#xff08;蓝色臂角度减小&#xff09; #include <myhead.h> #…

使用GitZip for github插件下载git仓库中的单个文件

背景&#xff1a;git仓库不知道抽什么疯&#xff0c;下载不了单个文件&#xff0c;点击下载没有反应&#xff0c;遂找寻其他方法&#xff0c;在这里简单记录下。 使用GitZip for github插件下载仓库中的单个文件 1、首先在浏览器安装插件&#xff0c;并确保为打开状态。 2、然…

Y20030022基于PHP+MYSQL疫苗预约管理网站的设计与实现 源码 初稿

旅游度假区微信小程序 1.摘要2.研究背景和意义3. 系统功能4.界面展示5.源码获取 1.摘要 疫苗预约管理系统是为了提供一个高效、便捷、安全的平台&#xff0c;方便用户进行疫苗预约接种&#xff0c;并优化疫苗接种的管理工作。通过该系统&#xff0c;用户可以随时随地进行预约操…

C#中判断两个 List<T> 的内容是否相等

ET实现游戏中邮件系统逻辑思路&#xff08;服务端&#xff09;_游戏邮件系统设计-CSDN博客 场景&#xff1a;今天遇到一个BUG&#xff0c;在服务器重启的时候&#xff08;体验服&#xff09;&#xff0c;玩家之前接收的邮件又重新接收了一次&#xff0c;但是两封邮件的ID是不同…

算法编程题-优势洗牌

算法编程题-优势洗牌 原题描述方法一、排序二分查找思路简述代码实现复杂度分析 方法二、红黑树思路简述代码实现复杂度分析 方法三、贪心思路简述代码实现复杂度分析 摘要&#xff1a;本文将对LeetCode原题优势洗牌进行介绍&#xff0c;从最容易想到的方法开始&#xff0c;循序…

【从零开始的LeetCode-算法】3264. K 次乘运算后的最终数组 I

给你一个整数数组 nums &#xff0c;一个整数 k 和一个整数 multiplier 。 你需要对 nums 执行 k 次操作&#xff0c;每次操作中&#xff1a; 找到 nums 中的 最小 值 x &#xff0c;如果存在多个最小值&#xff0c;选择最 前面 的一个。将 x 替换为 x * multiplier 。 请你…

ERROR in [eslint] Invalid Options ‘extensions‘ has been removed.

看着这个报错 感觉是版本不对引起的 ERROR in [eslint] Invalid Options: - Unknown options: extensions - extensions has been removed. ERROR in Error: Child compilation failed: [eslint] Invalid Options: - Unknown options: extensions - extensions has b…

SpringCloud书单推荐

重新定义SpringCloud实战 129 疯狂SpringCloud微服务架构实战 SpringBootSpringCloud微服务开发实战 点餐系统 SpringCloud微服务架构实战派 日访问量3000W平台 SpringCloud Alibaba微服务原理与实战 Spring CloudNginx 极简spring cloud实战 Spring Cloud 微服…

试题转excel;试题整理工具;试卷转excel;word转excel

一、问题描述 我父亲是一名教师&#xff0c;偶尔会需要将试卷转excel&#xff0c;方便管理处理一些特别重要的题目 于是&#xff0c;就抽空写一个专门将试题转excel的工具&#xff0c;便于各位教师从业者和教育行业的朋友更好的整理试题&#xff0c;减少一点重复枯燥的工作 …

Node.js Fastify装饰器:提升你的API性能与功能

在Node.js的世界中&#xff0c;Fastify以其卓越的性能和插件化架构脱颖而出&#xff0c;成为构建高效API的首选框架之一。Fastify的装饰器功能&#xff0c;允许开发者以声明式的方式增强和扩展核心对象&#xff0c;如请求&#xff08;Request&#xff09;和响应&#xff08;Res…

数据库管理-第267期 23ai:Oracle Data Redaction演示(20241128)

数据库管理267期 2024-11-286 数据库管理-第267期 23ai&#xff1a;Oracle Data Redaction演示&#xff08;20241128&#xff09;1 示例表及数据2 创建编校策略2.1 名字全编校2.2 电话部分编校 3 DML演示3.1 场景13.2 场景2 总结 数据库管理-第267期 23ai&#xff1a;Oracle Da…

C#VB.Net项目一键多国语言显示

如何在项目什么都不做一键支持多国语言显示 开始我们的一键快捷使用之旅 01.创建多语言项目 02.一键批量窗口开启本地化,添加选中内容添加Mu方法 03.一键快捷翻译 04.运行查看效果 01.创建多语言项目 创建多语言项目前,请先下载安装&#xff0c;注册并登录. 为了便于演示这…

像素流送api ue多人访问需要什么显卡服务器

关于像素流送UE推流&#xff0c;在之前的文章里其实小芹和大家聊过很多&#xff0c;不过今天偶然搜索发现还是有很多小伙伴&#xff0c;在搜索像素流送相关的问题&#xff0c;搜索引擎给的提示有这些。当然这些都是比较短的词汇&#xff0c;可能每个人真正遇到的问题和想获取的…

构建高可用系统设计OpenStack、Docker、Mesos和Kubernetes(简称K8s)

如果构建高可用、高并发、高效运维的大型系统 大型系统架构设计包括业务层设计、服务层设计、基础架层设计、存储层设计、网络层协同设计来完成。 一、业务层 根据主要业务范畴的分类和特征提取&#xff0c;抽象出独立的业务系统&#xff0c;分别统计系统的用户角色群体、访…

零基础Python学习

1.环境搭建 1.1 安装运行环境python3.13 Welcome to Python.org 1.2 安装集成开发环境PyCharm PyCharm: the Python IDE for data science and web development 1.3 创建项目 && 设置字体 2.基础语法 2.1 常量与表达式 在python中整数除整数不会优化&#xff0c;所…

Java Map

Map——广义集合的子集 HashTable是早期Java类库提供的一个哈希表实现&#xff0c;扩展了Dictionary类&#xff0c;类结构上与HashMap明显不同&#xff0c;本身是同步的&#xff0c;不支持null键和值&#xff0c;由于同步导致的性能开销&#xff0c;已经很少被推荐使用。 Hash…

【MySQL — 数据库基础】MySQL的安装与配置 & 数据库简单介绍

数据库基础 本节目标 掌握关系型数据库&#xff0c;数据库的作用掌握在Windows和Linux系统下安装MySQL数据库了解客户端工具的基本使用和SQL分类了解MySQL架构和存储引擎 1. 数据库的安装与配置 1.1 确认MYSQL版本 处理无法在 cmd 中使用 mysql 命令的情况&a…

实测数据处理(BP算法处理)——SAR成像算法系列(九)

系列文章目录 《SAR学习笔记-SAR成像算法系列&#xff08;一&#xff09;》 《后向投影算法&#xff08;BPA&#xff09;-SAR成像算法系列&#xff08;二&#xff09;》 《后向投影算法&#xff08;续&#xff09;-SAR成像算法系列&#xff08;八&#xff09;》 文章目录 一…

(数据结构与算法)如何提高学习算法的效率?面试算法重点有哪些?面试需要哪些能力?

面试官眼中的求职者 通过对你算法的考察&#xff01;&#xff01;&#xff01;&#xff01; 缩进太多&#xff01;&#xff01;一般不要超过三层&#xff01;&#xff01;&#xff01;缩进越少&#xff0c;bug越少&#xff1b;逻辑比较复杂&#xff0c;把这些包装成为函数&…