Java設計模式之中介者模式:從入門到架構級實踐

一、什么是中介者模式?

中介者模式(Mediator Pattern)是一種行為型設計模式,其核心思想是通過引入一個中介對象來封裝多個對象之間的交互關系。這種模式將原本復雜的網狀通信結構轉換為星型結構,類似于現實生活中的機場塔臺調度系統:所有飛機不再需要與其他飛機直接通信,而是統一通過塔臺協調飛行路線和起降順序。

模式特點擴展:

  • 通信標準化:定義統一的交互協議

  • 狀態管理:中介者可以維護全局狀態

  • 事務協調:支持跨對象的事務操作

  • 動態路由:根據運行時條件決定消息流向


二、為什么需要中介者模式?——深入痛點分析

2.1 復雜系統通信問題

在大型軟件系統中,當對象間存在以下通信特征時,系統復雜度會急劇上升:

  • 多對多依賴:一個對象需要與多個對象交互

  • 交叉調用:對象間的調用形成循環依賴

  • 狀態同步:需要保持多個對象狀態的一致性

  • 條件路由:消息傳遞需要基于特定業務規則

典型案例:電商訂單系統

  • 訂單創建需要聯動庫存、支付、物流等多個模塊

  • 庫存鎖定失敗需要回滾支付操作

  • 物流狀態變更需要通知用戶和商家

2.2 傳統實現的問題

// 沒有中介者時的典型代碼結構
class Order {private InventoryService inventory;private PaymentService payment;private LogisticsService logistics;public void createOrder() {if(inventory.lockStock()) {if(payment.processPayment()) {logistics.scheduleDelivery();} else {inventory.releaseStock();}}}
}

存在的問題

  1. 業務邏輯分散在各個對象中

  2. 新增模塊需要修改現有代碼

  3. 錯誤處理邏輯復雜

  4. 難以實現事務一致性


三、模式結構深度解析

3.1 核心角色擴展說明

1. 抽象中介者(Mediator)—— 通信協議設計
public interface OrderMediator {// 注冊組件void register(String componentName, OrderComponent component);// 事件通知方法void notifyEvent(OrderComponent sender, OrderEvent event);// 事務補償接口void rollback(OrderTransaction transaction);// 狀態查詢接口OrderSystemState getCurrentState();
}
2. 具體中介者(ConcreteMediator)—— 業務規則實現
public class OrderCoordinator implements OrderMediator {private Map<String, OrderComponent> components = new ConcurrentHashMap<>();private OrderSystemState systemState = new OrderSystemState();private TransactionLog transactionLog = new TransactionLog();@Overridepublic void notifyEvent(OrderComponent sender, OrderEvent event) {// 使用策略模式處理不同事件類型EventHandler handler = EventHandlerFactory.getHandler(event.getType());handler.handle(this, sender, event);}// 實現事務補償@Overridepublic void rollback(OrderTransaction transaction) {transaction.getSteps().reverse().forEach(step -> {OrderComponent component = components.get(step.getComponentName());component.compensate(step.getParameters());});}
}
3. 抽象同事類(Colleague)—— 組件標準化
public abstract class OrderComponent {protected OrderMediator mediator;protected String componentName;protected ComponentHealth healthStatus;public OrderComponent(String name, OrderMediator mediator) {this.componentName = name;this.mediator = mediator;mediator.register(name, this);}// 統一的生命周期接口public abstract void initialize();public abstract void shutdown();// 事務操作接口public abstract boolean execute(OrderCommand command);public abstract void compensate(Map<String, Object> params);// 健康檢查public ComponentHealth checkHealth() {return healthStatus;}
}

四、代碼實現:智能家居控制系統(增強版)

4.1 場景擴展需求

在原有基礎上增加:

  • 設備離線處理機制

  • 場景模式支持(離家模式、睡眠模式)

  • 能耗監控與報警

  • 異步事件處理

4.2 增強版中介者實現

public class SmartHomeHub implements SmartHomeMediator {private Map<String, Device> devices = new ConcurrentHashMap<>();private ExecutorService asyncExecutor = Executors.newFixedThreadPool(4);private EnergyMonitor energyMonitor = new EnergyMonitor();private AlertSystem alertSystem = new AlertSystem();@Overridepublic void notify(Device sender, DeviceEvent event) {// 異步處理事件asyncExecutor.submit(() -> {try {processEvent(sender, event);} catch (Exception e) {handleError(sender, event, e);}});}private void processEvent(Device sender, DeviceEvent event) {// 記錄設備活動energyMonitor.recordActivity(sender.getId(), event.getType());// 根據事件類型路由處理switch (event.getType()) {case "MOTION_DETECTED":handleMotionEvent(sender, event);break;case "TEMPERATURE_CHANGE":handleTemperatureEvent(sender, event);break;case "DEVICE_OFFLINE":handleOfflineEvent(sender, event);break;// 其他事件類型...}}private void handleOfflineEvent(Device sender, DeviceEvent event) {// 啟動設備健康檢查if (!checkDeviceHealth(sender)) {alertSystem.triggerAlert("設備離線警告: " + sender.getId());// 自動切換到備用設備failoverToBackup(sender);}}// 其他處理方法...
}

4.3 設備類的增強實現

public class SmartThermostat extends Device {private TemperatureSchedule schedule;private boolean isEnergySavingMode;@Overridepublic void execute(DeviceCommand command) {switch (command.getType()) {case "SET_TEMPERATURE":setTemperature((Double) command.getParam("value"));break;case "ENERGY_SAVING_MODE":enableEnergySaving((Boolean) command.getParam("enable"));break;}}private void setTemperature(double temp) {// 實際溫度控制邏輯System.out.println("Setting temperature to: " + temp);// 觸發溫度變化事件mediator.notify(this, new DeviceEvent("TEMPERATURE_CHANGED", Map.of("newTemp", temp, "oldTemp", currentTemp)));}@Overridepublic void handleEvent(DeviceEvent event) {if ("ENERGY_ALERT".equals(event.getType())) {enableEnergySaving(true);}}
}

五、架構級應用實踐(深度擴展)

5.1 微服務API網關的進階實現

增強功能需求

  • 動態路由配置

  • 服務熔斷降級

  • 請求/響應轉換

  • 分布式鏈路追蹤

public class AdvancedApiGateway implements Mediator {private ServiceRegistry registry;private CircuitBreakerManager circuitBreakers;private RequestTransformer transformer;private TracingContext tracer;public Response handleRequest(Request request) {// 1. 鏈路追蹤初始化Span span = tracer.startSpan("gateway.handle");try {// 2. 協議轉換InternalRequest internalReq = transformer.transform(request);// 3. 服務發現ServiceEndpoint endpoint = registry.discover(internalReq.getService());// 4. 熔斷檢查if (circuitBreakers.isOpen(endpoint)) {return fallbackResponse(internalReq);}// 5. 負載均衡選擇實例ServiceInstance instance = loadBalancer.select(endpoint);// 6. 請求轉發Response response = instance.call(internalReq);// 7. 響應轉換return transformer.transform(response);} catch (Exception e) {span.recordException(e);throw e;} finally {span.end();}}// 服務注冊回調接口public void onServiceRegistered(ServiceEvent event) {// 動態更新路由表registry.update(event.getService(), event.getInstances());// 初始化新的熔斷器circuitBreakers.createIfAbsent(event.getService());}
}

5.2 事件驅動架構中的消息中間件優化

高級特性實現

  • 消息持久化保證

  • 死信隊列處理

  • 消息優先級支持

  • 事務消息支持

public class ReliableMessageBroker implements Mediator {private MessageStore messageStore;private PriorityDispatcher dispatcher;private DeadLetterQueue dlq;public void publish(String topic, Message message) {// 事務管理Transaction tx = messageStore.beginTransaction();try {// 1. 持久化存儲messageStore.store(topic, message, tx);// 2. 分發到訂閱者List<Consumer> consumers = dispatcher.getSubscribers(topic);for (Consumer consumer : consumers) {dispatchToConsumer(consumer, message);}tx.commit();} catch (Exception e) {tx.rollback();dlq.store(topic, message, e);}}private void dispatchToConsumer(Consumer consumer, Message message) {try {if (consumer.getPriority() > message.getPriority()) {// 低優先級消息延遲處理delayQueue.put(message, 5000);return;}consumer.consume(message);} catch (ConsumerException e) {if (e.isRetryable()) {retryLater(message);} else {dlq.store(message, e);}}}
}

六、模式進階與變體(實戰擴展)

6.1 分布式Saga事務協調器實現

public class SagaMediator implements Mediator {private Map<String, SagaParticipant> participants = new HashMap<>();private SagaLogStore logStore = new SagaLogStore();public void coordinate(Saga saga) {SagaContext context = new SagaContext();try {for (SagaStep step : saga.getSteps()) {SagaParticipant participant = participants.get(step.getService());// 記錄操作日志logStore.logStepStart(step);// 執行正向操作boolean success = participant.execute(step.getAction(), context);if (!success) {throw new SagaAbortException("Step failed: " + step);}// 記錄補償點context.addCompensationPoint(step);}logStore.logSagaComplete(saga);} catch (Exception e) {logStore.logSagaAbort(saga, e);compensate(context);}}private void compensate(SagaContext context) {context.getCompensationPoints().reverse().forEach(step -> {SagaParticipant participant = participants.get(step.getService());try {participant.compensate(step.getAction(), context);} catch (Exception e) {// 記錄補償失敗logStore.logCompensationFailure(step, e);}});}
}

6.2 中介者與CQRS模式的結合

public class CqrsMediator implements Mediator {private CommandBus commandBus;private QueryBus queryBus;private EventPublisher eventPublisher;public <T> T execute(Command<T> command) {// 1. 命令校驗validateCommand(command);// 2. 命令路由CommandHandler<T> handler = commandBus.findHandler(command);// 3. 執行命令T result = handler.handle(command);// 4. 發布領域事件List<DomainEvent> events = handler.getGeneratedEvents();eventPublisher.publish(events);return result;}public <T> T query(Query<T> query) {QueryHandler<T> handler = queryBus.findHandler(query);return handler.handle(query);}
}

七、注意事項與最佳實踐(深度總結)

7.1 性能優化關鍵點

  1. 異步處理

    // 使用CompletableFuture實現異步中介
    public class AsyncMediator {private Executor executor = ForkJoinPool.commonPool();public <T> CompletableFuture<T> mediateAsync(MediationTask<T> task) {return CompletableFuture.supplyAsync(() -> {try {return processTask(task);} catch (Exception e) {throw new CompletionException(e);}}, executor);}
    }

  2. 批量處理優化

    public void batchNotify(List<Notification> notifications) {Map<String, List<Notification>> grouped = notifications.stream().collect(Collectors.groupingBy(Notification::getTargetType));grouped.forEach((type, list) -> {BatchProcessor processor = processorRegistry.getProcessor(type);processor.processBatch(list);});
    }

7.2 可靠性設計要點

  1. 事務一致性

    • 實現兩階段提交協議

    • 使用補償事務模式

    • 記錄詳細操作日志

  2. 錯誤恢復機制

    public class RetryMediator implements Mediator {private static final int MAX_RETRIES = 3;public void sendWithRetry(Message message) {int attempts = 0;while (attempts < MAX_RETRIES) {try {doSend(message);return;} catch (NetworkException e) {attempts++;waitForRetry(attempts);}}throw new SendFailedException("Max retries exceeded");}
    }

7.3 測試策略建議

  1. 中介者單元測試

    @Test
    void testTemperatureEventHandling() {// 初始化SmartHomeHub hub = new SmartHomeHub();TemperatureSensor sensor = new TemperatureSensor("sensor1", hub);SmartThermostat thermostat = new SmartThermostat("thermo1", hub);// 觸發事件sensor.detectTemperatureChange(25.0);// 驗證結果assertThat(thermostat.getCurrentTemp()).isEqualTo(25.0);assertThat(hub.getEnergyUsage()).isGreaterThan(0);
    }

  2. 混沌測試場景

    • 隨機斷開設備連接

    • 模擬高延遲響應

    • 注入錯誤消息

    • 測試事務回滾機制


八、總結:模式的選擇與演進

8.1 中介者模式 vs 其他模式

模式適用場景關注點
中介者復雜對象交互集中控制通信
觀察者一對多依賴事件通知
外觀模式簡化子系統訪問統一入口
代理模式訪問控制對象間接訪問

8.2 架構演進建議

  1. 初期階段:在局部復雜交互處引入簡單中介者

  2. 中期擴展:逐步抽象為通用協調框架

  3. 成熟階段:支持插件化擴展和動態配置

  4. 云原生演進:演變為Service Mesh的Sidecar模式

8.3 未來發展方向

  1. AI驅動的智能路由:使用機器學習優化消息路徑

  2. 區塊鏈協調器:基于智能合約的分布式中介

  3. 邊緣計算協調:跨邊緣節點的協同中介

  4. 量子計算適配:設計量子友好的協調算法


通過本文的深度擴展,我們不僅掌握了中介者模式的基礎用法,更深入探討了其在復雜系統架構中的高級應用場景。在實際項目中,建議根據具體需求靈活運用模式的變體和優化策略,同時注意平衡模式的收益與復雜度成本。中介者模式的價值在分布式系統日益復雜的今天愈發重要,是構建可維護、可擴展系統的重要工具之一。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/78954.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/78954.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/78954.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Trinity三位一體開源程序是可解釋的 AI 分析工具和 3D 可視化

一、軟件介紹 文末提供源碼和程序下載學習 Trinity三位一體開源程序是可解釋的 AI 分析工具和 3D 可視化。Trinity 提供性能分析和 XAI 工具&#xff0c;非常適合深度學習系統或其他執行復雜分類或解碼的模型。 二、軟件作用和特征 Trinity 通過結合具有超維感知能力的不同交…

LeetCode 熱題 100_單詞拆分(86_139_中等_C++)(動態規劃)

LeetCode 熱題 100_單詞拆分&#xff08;86_139&#xff09; 題目描述&#xff1a;輸入輸出樣例&#xff1a;題解&#xff1a;解題思路&#xff1a;思路一&#xff08;動態規劃&#xff09;&#xff1a; 代碼實現代碼實現&#xff08;思路一&#xff08;動態規劃&#xff09;&a…

VM虛擬機安裝及Ubuntu安裝配置

VM虛擬機安裝及Ubuntu安裝配置 1、VM虛擬機安裝2、創建虛擬機3、Ubuntu系統安裝4、編譯環境配置4.1 、Ubuntu和 Windows文件互傳 文件互傳4.1.1、 開啟Ubunt下的FTP服務 4.2、 Ubuntu下NFS和SSH服務開啟4.2.1、 NFS服務開啟4.2.2、 SSH服務開啟 4.3、 交叉編譯器安裝4.3.1 安裝…

【KWDB 創作者計劃】_產品技術解讀_1

【KWDB 創作者計劃】_產品技術解讀_1 一、存儲引擎:高性能混合存儲架構1. 存儲模型設計2. 存儲壓縮與編碼3. 持久化策略二、KWDB 組件源碼解析1. 核心模塊分層架構2. 關鍵組件源碼剖析三、KWDB 特性代碼通讀1. 實時分析能力(Real-Time OLAP)2. 混合負載隔離(HTAP)3. 智能索…

高速電路中的電阻、電容的選型及應用

2.1 電阻的應用 2.1.1 與電阻相關的經典案例 如果說芯片是電路的骨架&#xff0c;那么電阻就是在芯片之間起連接作用的關節。電阻的阻值、布放位置等&#xff0c;對設計的成功起著至關重要的作用。 【案例2.1】串聯電阻過大&#xff0c;導致板間告警失敗 某產品由業務板和主…

springBoot接入文心一言

文章目錄 效果接入步驟項目接入配置類&#xff1a;WenXinYiYan前端vue代碼js代碼 后端mapper層service層controller層 測試代碼 效果 先來看一下最后實現的效果 &#xff08;1&#xff09;未點擊前的功能頁面 &#xff08;2&#xff09;點擊后的頁面 &#xff08;3&#xff…

css解決邊框四個角有顏色

效果 html <div class"gradient-corner">2021年</div>css background:/* 左上角橫線 */linear-gradient(90deg, rgb(5, 150, 247) 9px, transparent 0) 0 0,/* 左上角豎線 */linear-gradient(0deg, rgb(5, 150, 247) 9px, transparent 0) 0 0,/* 右上…

自動化三維掃描:CASAIM外觀尺寸智能檢測

制造業向智能化、數字化加速轉型&#xff0c;傳統檢測方式因效率低、精度差、數據斷層等問題&#xff0c;已難以滿足現代工業對精密測量與實時質控的需求。CASAIM依托前沿技術實力&#xff0c;以自動化三維掃描為核心&#xff0c;為工業檢測提供了從數據采集到智能分析的全流程…

突破亞馬遜壁壘,Web Unlocker API 助您輕松獲取數據

目錄 一、Web Unlocker API簡介二、開始使用Web Unlocker API1、首先進入控制臺頁面&#xff0c;點擊左側第一個tab鍵“代理 & 抓取基礎設施”&#xff0c;找到“網頁解鎖器”&#xff0c;開始使用。2、進入網頁解鎖器頁面后&#xff0c;填寫通道名稱&#xff0c;添加簡短描…

【力扣05】最長回文子串

0. 引言 ●子串(substring&#xff09;&#xff1a;原始字符串的一個連續子集; ●子序列&#xff08;subsequence&#xff09;&#xff1a;原始字符串的一個子集。 1. 什么叫回文串&#xff1f; 如果一個字符串正著讀和反著讀是一樣的&#xff0c;那它就是回文串。[1] 例如&…

統計銷量前十的訂單

傳入參數&#xff1a; 傳入begin和end兩個時間 返回參數 返回nameList和numberList兩個String類型的列表 controller層 GetMapping("/top10")public Result<SalesTop10ReportVO> top10(DateTimeFormat(pattern "yyyy-MM-dd") LocalDate begin,Dat…

【HDFS入門】HDFS核心組件Secondary NameNode角色職責與運行機制解析

目錄 1 Secondary NameNode的角色定位與常見誤解 2 核心職責詳解 2.1 核心功能職責 2.2 與NameNode的協作關系 3 運行機制深度剖析 3.1 檢查點觸發機制 3.2 元數據合并流程 4 與Hadoop 2.0 HA架構的對比 5 配置調優指南 5.1 關鍵配置參數 5.2 性能優化建議 6 實踐應…

MySQL存儲引擎:存儲什么意思?引擎什么意思?存儲引擎是什么?在MySQL中有什么作用?

MySQL存儲引擎詳解 一、術語解析 “存儲”與“引擎”的漢語詞典解釋 1. 存儲&#xff08;chǔ cn&#xff09; 漢語詞典釋義&#xff1a; ? 動詞&#xff1a; ? 存放、保存&#xff08;將物品或信息放置在特定地方&#xff0c;以便后續使用&#xff09;。 ? 例&#xff…

測試第三課-------自動化測試相關

作者前言 &#x1f382; ??????&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ?&#x1f382; 作者介紹&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

Hive null safe的用法

總結: null safe 是用<> 代表比較&#xff0c;而不是用 。null <> null 返回 true&#xff0c; 而 null null 代表 false。 NULL 和任意字符比較都返回 NULL&#xff0c;而不是 true 或者 false。如 SELECT 1 1, NULL NULL, 1 NULL;輸出 true NULL NULL如果我…

LINUX基礎 [四] - Linux工具

目錄 軟件包管理器yum Linux開發工具vim vim的基本概念 vim的三種常用模式 vim的簡單配置 vim常用模式的基本操作 命令模式 底行模式 處理vim打開文件報錯的問題 Linux編譯器-gcc/g使用 為什么我們可以用C/C做開發呢&#xff1f; 預處理&#xff08;進行宏替換&#x…

RocketMQ 03

今天是2025/04/14 21:58 day 20 總路線請移步主頁Java大綱相關文章 今天進行RocketMQ 6,7,8 個模塊的歸納 最近在忙畢設&#xff0c;更新有點慢&#xff0c;見諒 首先是RocketMQ 的相關內容概括的思維導圖 6. 安全機制 6.1 ACL 訪問控制 核心功能 權限分級&#xff1a;通過…

深入理解瀏覽器的 Cookie:全面解析與實踐指南

在現代 Web 開發中&#xff0c;Cookie 扮演著舉足輕重的角色。它不僅用于管理用戶會話、記錄用戶偏好&#xff0c;還在行為追蹤、廣告投放以及安全防護等諸多方面發揮著重要作用。隨著互聯網應用場景的不斷豐富&#xff0c;Cookie 的使用和管理也日趨復雜&#xff0c;如何在保障…

在企業級部署中如何優化NVIDIA GPU和容器環境配置:最佳實踐與常見誤區20250414

在企業級部署中如何優化NVIDIA GPU和容器環境配置&#xff1a;最佳實踐與常見誤區 引言 隨著AI和深度學習技術的迅速發展&#xff0c;企業對GPU加速計算的需求愈加迫切。在此過程中&#xff0c;如何高效地配置宿主機與容器化環境&#xff0c;特別是利用NVIDIA GPU和相關工具&…

【秣厲科技】LabVIEW工具包——OpenCV 教程(19):拾遺 - imgproc 基礎操作(上)

文章目錄 前言imgproc 基礎操作&#xff08;上&#xff09;1. 顏色空間2. 直方圖3. 二值化4. 腐蝕、膨脹、開閉運算5. 梯度與輪廓6. 簡易繪圖7. 重映射 總結 前言 需要下載安裝OpenCV工具包的朋友&#xff0c;請前往 此處 &#xff1b;系統要求&#xff1a;Windows系統&#x…