面试题答案
一键面试中介者模式可融合的设计模式
- 观察者模式
- 融合场景:在一个图形用户界面(GUI)系统中,有多个组件(如按钮、文本框等)。这些组件之间存在复杂的交互关系,同时每个组件可能还需要对一些系统级别的事件(如窗口关闭、系统主题切换等)做出响应。中介者模式可以处理组件之间的交互,而观察者模式可以让组件对系统级别的事件进行监听。
- 优势:将组件间的直接交互解耦,通过中介者统一协调,同时利用观察者模式的发布 - 订阅机制,让组件能够高效地响应系统级事件,增强系统的可维护性和扩展性。
- 单例模式
- 融合场景:当系统中需要一个全局唯一的中介者对象来管理所有组件之间的交互时。例如在一个企业级应用的消息处理模块中,中介者负责协调不同模块之间的消息传递,为了保证消息处理逻辑的一致性和避免重复创建中介者带来的资源浪费,可与单例模式结合。
- 优势:确保中介者对象的唯一性,避免多个中介者实例可能导致的不一致问题,同时节省系统资源。
中介者模式与观察者模式结合示例代码
import java.util.ArrayList;
import java.util.List;
// 抽象观察者
abstract class Observer {
public abstract void update(String message);
}
// 具体观察者1
class ConcreteObserver1 extends Observer {
@Override
public void update(String message) {
System.out.println("ConcreteObserver1 received message: " + message);
}
}
// 具体观察者2
class ConcreteObserver2 extends Observer {
@Override
public void update(String message) {
System.out.println("ConcreteObserver2 received message: " + message);
}
}
// 抽象中介者
abstract class Mediator {
public abstract void sendMessage(String message, Observer observer);
}
// 具体中介者
class ConcreteMediator extends Mediator {
private List<Observer> observers = new ArrayList<>();
public void registerObserver(Observer observer) {
observers.add(observer);
}
@Override
public void sendMessage(String message, Observer observer) {
for (Observer obs : observers) {
if (obs != observer) {
obs.update(message);
}
}
}
}
public class Main {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteObserver1 observer1 = new ConcreteObserver1();
ConcreteObserver2 observer2 = new ConcreteObserver2();
mediator.registerObserver(observer1);
mediator.registerObserver(observer2);
mediator.sendMessage("Hello from Observer1", observer1);
}
}
在上述代码中,Observer
是抽象观察者,ConcreteObserver1
和 ConcreteObserver2
是具体观察者。Mediator
是抽象中介者,ConcreteMediator
是具体中介者,它不仅管理组件(观察者)之间的交互(通过 sendMessage
方法),还利用观察者模式的注册机制(registerObserver
方法)让各个观察者能够接收到相关消息,实现了两种模式的有效结合。