MST

星途 面试题库

面试题:Java观察者模式与其他设计模式在复杂事件驱动系统中的协同应用

在一个复杂的事件驱动系统中,除了观察者模式,可能还会用到其他设计模式来优化架构。请举例说明Java观察者模式如何与至少两种其他设计模式(如策略模式、单例模式等)协同工作,以满足系统的高扩展性、可维护性等需求,需要详细阐述设计思路及代码实现框架。
44.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

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 可以注册到这个单例主题上接收事件通知,实现了观察者模式与单例模式的协同工作。