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

发布于:2024-12-07 ⋅ 阅读:(188) ⋅ 点赞:(0)

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区: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 !!!


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

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

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


网站公告

今日签到

点亮在社区的每一天
去签到