面试题答案
一键面试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. 职责划分与交互
- 被观察者职责:维护观察者列表,提供注册、移除观察者的方法,以及在自身状态改变时通知所有观察者。
- 观察者职责:实现更新方法,接收被观察者的通知并进行相应处理。
- 交互方式:被观察者通过调用观察者的更新方法来通知观察者状态改变,观察者在被通知后执行自身的业务逻辑。