MST

星途 面试题库

面试题:Java中观察者模式如何在消息队列基础框架搭建中初步应用

假设你正在搭建一个简单的消息队列基础框架,简述如何运用Java的观察者模式来实现消息的发布与订阅功能,需要说明关键的类和接口设计以及它们之间的交互逻辑。
29.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

关键类和接口设计

  1. 主题接口(Subject)
    • 定义注册观察者、移除观察者和通知观察者的方法。
    • 示例代码:
import java.util.ArrayList;
import java.util.List;

public interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers(String message);
}
  1. 观察者接口(Observer)
    • 定义更新方法,当主题状态改变时被调用。
    • 示例代码:
public interface Observer {
    void update(String message);
}
  1. 具体主题类(ConcreteSubject)
    • 实现主题接口,维护一个观察者列表,并实现注册、移除和通知方法。
    • 示例代码:
public class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

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

    @Override
    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}
  1. 具体观察者类(ConcreteObserver)
    • 实现观察者接口,定义具体的更新逻辑。
    • 示例代码:
public class ConcreteObserver implements Observer {
    private String name;
    public ConcreteObserver(String name) {
        this.name = name;
    }
    @Override
    public void update(String message) {
        System.out.println(name + " received message: " + message);
    }
}

交互逻辑

  1. 注册过程:具体观察者实例调用具体主题的registerObserver方法,将自身注册到主题的观察者列表中。例如:
ConcreteSubject subject = new ConcreteSubject();
ConcreteObserver observer1 = new ConcreteObserver("Observer1");
subject.registerObserver(observer1);
  1. 消息发布:当具体主题有新消息时,调用notifyObservers方法,并传入消息内容。例如:
subject.notifyObservers("New message from subject");
  1. 消息订阅与处理:主题遍历观察者列表,调用每个观察者的update方法,观察者根据自身逻辑处理收到的消息。如ConcreteObserver中的update方法会打印收到的消息。