面试题答案
一键面试1. 观察者模式与策略模式协同工作
设计思路
- 观察者模式:用于处理对象间的一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会得到通知并自动更新。
- 策略模式:定义一系列算法,将每个算法都封装起来,并且使它们之间可以互换。在事件驱动系统中,不同的观察者可能需要以不同的策略来处理接收到的事件。通过策略模式,我们可以为不同的观察者提供灵活的处理策略,增强系统的可扩展性。
代码实现框架
// 策略接口
interface EventHandlingStrategy {
void handleEvent(String event);
}
// 具体策略类
class DefaultHandlingStrategy implements EventHandlingStrategy {
@Override
public void handleEvent(String event) {
System.out.println("Default handling of event: " + event);
}
}
class SpecialHandlingStrategy implements EventHandlingStrategy {
@Override
public void handleEvent(String event) {
System.out.println("Special handling of event: " + event);
}
}
// 主题接口
interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers(String event);
}
// 具体主题类
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 event) {
for (Observer observer : observers) {
observer.update(event);
}
}
}
// 观察者接口
interface Observer {
void update(String event);
}
// 具体观察者类,使用策略模式
class ConcreteObserver implements Observer {
private EventHandlingStrategy strategy;
public ConcreteObserver(EventHandlingStrategy strategy) {
this.strategy = strategy;
}
@Override
public void update(String event) {
strategy.handleEvent(event);
}
}
2. 观察者模式与单例模式协同工作
设计思路
- 单例模式:确保一个类只有一个实例,并提供一个全局访问点。在事件驱动系统中,可能存在一些全局的主题对象,比如系统级别的事件发布者,使用单例模式可以保证整个系统中只有一个这样的发布者实例,避免重复创建带来的资源浪费,同时也便于管理和维护。
代码实现框架
// 单例主题类
class SingletonSubject implements Subject {
private static SingletonSubject instance;
private List<Observer> observers = new ArrayList<>();
private SingletonSubject() {}
public static SingletonSubject getInstance() {
if (instance == null) {
synchronized (SingletonSubject.class) {
if (instance == null) {
instance = new SingletonSubject();
}
}
}
return instance;
}
@Override
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(String event) {
for (Observer observer : observers) {
observer.update(event);
}
}
}
// 观察者接口
interface Observer {
void update(String event);
}
// 具体观察者类
class ConcreteObserver implements Observer {
@Override
public void update(String event) {
System.out.println("Observer received event: " + event);
}
}
在上述代码中,SingletonSubject
通过单例模式确保只有一个实例,作为事件的发布者,不同的 ConcreteObserver
可以注册到这个单例主题上接收事件通知,实现了观察者模式与单例模式的协同工作。