Java设计模式:观察者模式

❤ 作者主页:欢迎来到我的技术博客😎
❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~*
🍊 如果文章对您有帮助,记得关注点赞收藏评论⭐️⭐️⭐️
📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉

一、观察者模式的定义

观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种 一对多 的依赖关系,让多个观察者对象同时监听一个主题对象的状态变化。当主题对象的状态发生变化时,它会自动通知所有的观察者对象,使得它们能够自动更新自己。

观察者模式的主要目的是实现对象之间的松耦合,让主题对象和观察者对象之间的关系解耦。通过观察者模式,可以方便地添加、移除和通知观察者,使得系统更加灵活和可扩展。


二、观察者模式的结构

观察者模式包含以下的重要角色:

  • 抽象主题(Subject): 负责维护观察者列表,提供注册、取消注册和通知观察者的方法。
  • 具体主题(Concrete Subject): 实现主题接口,维护观察者列表,并在状态变化时通知观察者。
  • 抽象观察者(Observer): 定义更新接口,用于接收主题状态变化的通知。
  • 具体观察者(Concrete Observer): 实现观察者接口,具体定义如何处理接收到的通知。

三、观察者模式的实现

需求案例:假设要开发一个电商平台的订单系统,你需要实现一个订单状态通知功能。当用户的订单状态发生变化时,系统需要自动向用户发送通知,告知他们订单的最新状态。

使用观察者模式实现上述案例,类图如下:
在这里插入图片描述
 
具体的类设计如下:

抽象观察者:

public interface OrderObserver {

    void update(String orderId, String newStatus);
}

具体观察者:

public class User implements OrderObserver {

    private String name;

    public User(String name) {
        this.name = name;
    }

    @Override
    public void update(String orderId, String newStatus) {
        System.out.println(name + "收到了订单" + orderId + " 的状态更新消息,新状态为:" + newStatus);
    }
}

抽象主题:

public interface OrderSubject {

    //添加用户(添加观察者对象)
    void registerObserver(OrderObserver observer);

    //删除用户
    void unregisterObserver(OrderObserver observer);

    //通知用户更新消息
    void notifyObservers(String orderId, String newStatus);
}

具体主题:

public class Order implements OrderSubject {

    private List<OrderObserver> observerList = new ArrayList<>();


    @Override
    public void registerObserver(OrderObserver observer) {
        observerList.add(observer);
    }

    @Override
    public void unregisterObserver(OrderObserver observer) {
        observerList.remove(observer);
    }

    @Override
    public void notifyObservers(String orderId, String newStatus) {
        for (OrderObserver observer : observerList) {
            observer.update(orderId, newStatus);
        }
    }
}

客户端类:

public class Client {

    public static void main(String[] args) {

        Order order = new Order();
        User user1 = new User("小明");
        User user2 = new User("小王");

        //在订单主题中添加观察对象user1和user2,并且发布更新消息
        order.registerObserver(user1);
        order.registerObserver(user2);
        order.notifyObservers("1001", "已发货");

        System.out.println("=================");

        //在订单主题中取消观察对象user1,并且发布更新消息
        order.unregisterObserver(user1);
        order.notifyObservers("1001", "已签收");
    }
}

测试结果如下:
在这里插入图片描述
 
在上面的示例中,Order 表示订单主题,User 表示观察者。当订单状态发生变化时,订单主题会通知所有已注册的观察者,观察者收到通知后执行相应的更新操作(在这里是打印订单状态变化日志)。


四、观察者模式的优缺点

优点:

  1. 松耦合: 观察者模式实现了主题和观察者之间的松耦合关系。主题只需要知道观察者接口,而不需要知道具体的观察者。这样可以使主题和观察者之间的依赖关系解耦,提高系统的灵活性和可维护性。
  2. 可扩展性: 通过观察者模式,可以方便地添加、移除和通知观察者。当需要新增观察者时,只需实现观察者接口,并在主题中注册即可,无需修改主题的代码。同样地,当需要移除观察者时,只需在主题中取消注册即可,也无需修改观察者的代码。这样,系统的扩展性大大增强。
  3. 分布式通知: 观察者模式可以支持多个观察者同时监听一个主题。当主题的状态发生变化时,它会自动通知所有的观察者,实现了一种分布式的事件通知机制。

缺点:

  1. 观察者者过多: 如果观察者过多或观察者之间的逻辑复杂,可能会导致观察者模式的设计变得复杂。观察者之间的依赖关系和通信可能会变得混乱,导致系统难以理解和调试。
  2. 顺序执行: 在观察者模式中,观察者的执行顺序是不确定的,它们同时监听主题,并在主题状态变化时被通知。这种并发执行可能会导致观察者之间的依赖关系问题,需要谨慎设计。

五、观察者模式的使用场景

观察者模式适用于以下场景:

  1. 发布-订阅系统: 当一个主题(发布者)发布消息时,多个订阅者(观察者)可以同时接收到通知。例如,一个新闻发布系统可以将新闻作为主题,而订阅者可以是不同的用户或订阅频道。
  2. GUI 事件处理: 在用户界面开发中,观察者模式可以用于处理事件的订阅和响应。例如,当点击一个按钮时,按钮就是观察者,而按钮的点击事件就是主题,其他的 UI 组件可以订阅按钮的点击事件,并执行相应的操作。
  3. 系统监控和日志记录: 在系统监控和日志记录中,可以使用观察者模式来实时监测和记录系统中的各种状态和事件。主题可以是系统的某个组件或模块,而观察者可以是负责监控和记录日志的模块。
  4. 消息队列和异步通信: 观察者模式可以用于实现消息队列和异步通信的机制。主题作为消息的发布者,而观察者可以订阅消息并异步处理。
  5. 配置和状态管理: 在配置和状态管理中,观察者模式可以用于在配置文件或状态变化时通知相关的组件进行更新。例如,当配置文件发生更改时,可以通过观察者模式通知相关的组件重新加载配置。

 
非常感谢您阅读到这里,如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 分享👥 留言💬thanks!!!

  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java技术一点通

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值