高级java每日一道面试题-2024年8月14日-设计模式篇-你对观察者设计模式了解多少?

如果有遗漏,评论区告诉我进行补充

面试官: 你对观察者设计模式了解多少?

我回答:

在Java高级面试中,对观察者设计模式(Observer Pattern)的理解是一个重要的考察点。观察者模式是一种基于发布-订阅机制的行为型设计模式,它用于在对象之间建立一种一对多的依赖关系,使得当一个对象(被观察者)的状态发生变化时,所有依赖于它的对象(观察者)都会得到通知并自动更新。这种模式在事件处理系统、图形用户界面(GUI)组件以及实时数据流处理等领域非常常见。以下是对观察者设计模式的详细解析:

一、观察者模式的基本概念

  • 主题(Subject):也称为被观察者或可观察者,它是具有状态的对象,并维护着一个观察者列表。主题提供了添加、删除和通知观察者的方法,并在状态发生变化时通知所有的观察者。Subject可以是抽象类或接口。
  • 观察者(Observer):接收主题通知的对象。观察者需要实现一个更新方法,当收到主题的通知时,调用该方法进行更新操作。
  • 具体主题(Concrete Subject):具体主题是主题的具体实现类。它维护着观察者列表,并在状态发生改变时通知观察者。
  • 具体观察者(Concrete Observer):具体观察者是观察者的具体实现类。它实现了更新方法,定义了在收到主题通知时需要执行的具体操作。

二、观察者模式的原理

  • 解耦性:主题和观察者之间是松耦合的,它们之间通过抽象的接口进行通信,使得它们可以独立地进行修改和扩展。
  • 可扩展性:可以方便地增加新的观察者,而无需修改主题的代码。
  • 随时更新:主题状态变化时,观察者能够立即得到通知并进行相应的操作。
  • 规范性:观察者模式定义了主题和观察者之间的一套规范,使得代码更具可读性和可维护性。

三、观察者模式的实现步骤

  1. 定义主题接口:该接口包含添加、删除和通知观察者的方法。
  2. 实现具体主题类:该类维护一个观察者列表,并在状态变化时遍历列表,通知所有观察者。
  3. 定义观察者接口:该接口包含一个更新方法,用于接收和处理主题的通知。
  4. 实现具体观察者类:该类实现观察者接口,并在更新方法中定义具体的操作。
  5. 在主题类中注册观察者:在需要被观察的对象上注册观察者,以便在状态变化时通知它们。
  6. 在主题状态变化时通知观察者:当主题的状态发生变化时,遍历观察者列表,调用每个观察者的更新方法。

四、观察者模式的应用场景

  • 当一个对象的改变需要同时改变其他对象,并且你不知道有多少对象需要改变时。
  • 当一个对象需要将自己的改变通知给其他对象,而又不希望与其紧密耦合时。
  • 在实现事件驱动的系统时,观察者模式可以作为一种有效的通信机制。

五、观察者模式的优缺点

优点

  • 降低耦合度:降低了对象之间的耦合度。
  • 易于扩展:增强了系统的可扩展性,可以方便地增加或删除观察者。
  • 支持广播通信:实现了动态联动,当主题对象发生变化时,所有注册的观察者都会收到通知并自动更新。

缺点

  • 性能问题:如果主题对象有大量的观察者,每次状态变化都需要通知所有观察者,可能会造成性能问题。
  • 循环引用:如果观察者之间存在复杂的依赖关系,可能会导致循环引用,导致内存泄漏。

六、Java中的观察者模式实现

在Java中,观察者模式可以通过java.util.Observable类和java.util.Observer接口来实现,但是这两个类和接口已经被标记为过时,建议使用更现代的事件处理模型,如事件监听器和事件适配器。

自定义观察者模式可以通过实现Subject和Observer接口来完成,如下所示:

// Observer 接口
public interface Observer {
    void update(String state);
}

// Subject 接口
public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// ConcreteSubject 实现
public class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String state;

    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(state);
        }
    }

    public void setState(String state) {
        this.state = state;
        notifyObservers();
    }
}

// ConcreteObserver 实现
public class ConcreteObserver implements Observer {
    private String name;
    private String state;

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

    @Override
    public void update(String state) {
        this.state = state;
        System.out.println(name + ": " + state);
    }
}

综上所述,观察者设计模式在Java高级面试中是一个重要的考察点。掌握其基本概念、原理、实现步骤以及应用场景和优缺点,对于提升面试表现具有重要意义。

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

java我跟你拼了

您的鼓励是我创作的最大动力!

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

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

打赏作者

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

抵扣说明:

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

余额充值