MST
星途 面试题库

面试题:Java中如何通过接口和抽象类实现观察者模式

请描述在Java中,如何通过定义接口和抽象类来搭建观察者模式的基本框架,并给出关键代码示例。要求明确观察者和被观察者的职责划分,以及它们之间如何进行交互。
48.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. 观察者模式概述

观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

2. 接口定义

被观察者接口(Subject)

被观察者需要提供添加、移除和通知观察者的方法。

import java.util.ArrayList;
import java.util.List;

// 被观察者接口
interface Subject {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers();
}

观察者接口(Observer)

观察者需要实现一个更新方法,当被观察者状态改变时会调用此方法。

// 观察者接口
interface Observer {
    void update();
}

3. 抽象类定义(可选,用于简化被观察者实现)

可以定义一个抽象的被观察者类,实现部分通用逻辑。

// 抽象被观察者类
abstract class AbstractSubject implements Subject {
    protected List<Observer> observers = new ArrayList<>();

    @Override
    public void registerObserver(Observer o) {
        observers.add(o);
    }

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

    @Override
    public void notifyObservers() {
        for (Observer o : observers) {
            o.update();
        }
    }
}

4. 具体实现

具体被观察者(ConcreteSubject)

继承抽象被观察者类(或直接实现被观察者接口),并在状态改变时调用通知方法。

// 具体被观察者
class ConcreteSubject extends AbstractSubject {
    private int state;

    public int getState() {
        return state;
    }

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

具体观察者(ConcreteObserver)

实现观察者接口,在更新方法中进行相应处理。

// 具体观察者
class ConcreteObserver implements Observer {
    private Subject subject;

    public ConcreteObserver(Subject subject) {
        this.subject = subject;
        subject.registerObserver(this);
    }

    @Override
    public void update() {
        System.out.println("Observer notified, new state: " + ((ConcreteSubject) subject).getState());
    }
}

5. 测试代码

public class ObserverPatternTest {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        ConcreteObserver observer1 = new ConcreteObserver(subject);
        ConcreteObserver observer2 = new ConcreteObserver(subject);

        subject.setState(10);
    }
}

6. 职责划分与交互

  • 被观察者职责:维护观察者列表,提供注册、移除观察者的方法,以及在自身状态改变时通知所有观察者。
  • 观察者职责:实现更新方法,接收被观察者的通知并进行相应处理。
  • 交互方式:被观察者通过调用观察者的更新方法来通知观察者状态改变,观察者在被通知后执行自身的业务逻辑。