Java外觀模式實現方式與測試方法

一、外觀模式的實現方式

外觀模式的核心是通過封裝復雜子系統的調用邏輯,為客戶端提供一個統一的簡單接口。以下是實現步驟及示例:


  1. 定義子系統類
    子系統類負責實現具體功能,與外觀類解耦。例如,家庭影院系統中的投影儀、音響等組件:
// 子系統接口
interface TheaterControl {void on();void off();void setVolume(int volume);
}
// 具體子系統實現
class Projector implements TheaterControl {public void on() { System.out.println("投影儀開啟"); }public void off() { System.out.println("投影儀關閉"); }
}
class StereoSystem implements TheaterControl {public void on() { System.out.println("音響開啟"); }public void off() { System.out.println("音響關閉"); }public void setVolume(int volume) { System.out.println("音量設為:" + volume); }
}

  1. 創建外觀類
    外觀類聚合子系統對象,提供高層接口,協調子系統操作:
public class HomeTheaterFacade {private TheaterControl projector;private TheaterControl stereo;public HomeTheaterFacade() {this.projector = new Projector();this.stereo = new StereoSystem();}// 統一接口:觀影模式public void watchMovie(String movie) {System.out.println("準備觀看:" + movie);projector.on();stereo.on();stereo.setVolume(50);}
}

  1. 客戶端調用
    客戶端通過外觀類簡化復雜操作:
public class Client {public static void main(String[] args) {HomeTheaterFacade facade = new HomeTheaterFacade();facade.watchMovie("Java設計模式實戰");}
}

二、測試方法與Mockito框架應用

測試外觀模式時,需驗證其是否正確調用子系統方法。通過Mockito框架模擬子系統對象,確保外觀類邏輯正確。


  1. 基礎測試:驗證子系統方法調用
import static org.mockito.Mockito.*;
import org.junit.Test;
public class HomeTheaterFacadeTest {@Testpublic void testWatchMovie() {// 創建Mock對象TheaterControl mockProjector = mock(Projector.class);TheaterControl mockStereo = mock(StereoSystem.class);// 創建外觀類并注入Mock對象HomeTheaterFacade facade = new HomeTheaterFacade() {@Overridepublic TheaterControl getProjector() { return mockProjector; }@Overridepublic TheaterControl getStereo() { return mockStereo; }};// 執行外觀方法facade.watchMovie("測試電影");// 驗證子系統方法調用verify(mockProjector).on();verify(mockStereo).on();verify(mockStereo).setVolume(50);}
}

  1. 高級測試:異常處理與狀態驗證
    模擬子系統異常,測試外觀類的容錯邏輯:
@Test
public void testWatchMovieWithException() {TheaterControl mockProjector = mock(Projector.class);when(mockProjector.on()).thenThrow(new RuntimeException("投影儀故障"));HomeTheaterFacade facade = new HomeTheaterFacade() {@Overridepublic TheaterControl getProjector() { return mockProjector; }};try {facade.watchMovie("測試電影");fail("預期拋出異常");} catch (RuntimeException e) {assertEquals("投影儀故障", e.getMessage());}
}

三、實現與測試的注意事項

  1. 實現最佳實踐
    • 單一職責:外觀類僅負責協調子系統,避免包含業務邏輯。
    • 接口隔離:子系統應通過接口與外觀類交互,增強擴展性。
    • 線程安全:若外觀類被多線程訪問,需同步關鍵方法。
  2. 測試關鍵點
    • 覆蓋所有子系統調用:確保每個子系統方法在測試中被驗證。
    • 模擬異常場景:測試子系統故障時外觀類的容錯機制。
    • 避免過度模擬:僅Mock必要子系統,保留真實依賴以測試完整流程。

四、總結

外觀模式通過封裝復雜子系統的調用邏輯,顯著降低客戶端耦合度。實現時需遵循接口隔離與單一職責原則,測試時利用Mockito框架驗證子系統交互。其核心價值在于簡化接口設計,但需注意對開閉原則的潛在違背及測試復雜度問題。

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

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

相關文章

《解鎖AudioSet:開啟音頻分析的無限可能》

音頻新時代的 “密鑰”:AudioSet 登場 在科技飛速發展的今天,音頻作為信息傳播與交互的關鍵媒介,早已滲透到現代科技的各個角落。從智能手機中的語音助手,讓我們通過簡單的語音指令就能查詢信息、發送消息,到智能家居系…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | ThemeClock(主題時鐘)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— ThemeClock組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API 和 <script setup> 語法結…

直播預告丨聊聊Milvus 2.6新功能及背后的開發故事

7 月 1 日晚上 20:00-21:00&#xff0c;Zilliz 視頻號直播間&#xff0c;Zilliz 合伙人和研發VP 欒小凡將帶來《一步到位&#xff0c;詳解 Milvus 2.6 新功能》的分享&#xff0c;帶你拆解 Milvus 2.6 四大突破&#xff1a; 降本增效的底層架構開發者生產力拉滿的新功能性能不打…

pyenv-win 配置指南?

在 Python 開發過程中&#xff0c;經常會遇到需要使用不同版本 Python 的情況。比如&#xff0c;舊項目依賴某個特定的 Python 版本&#xff0c;而新項目則要求使用更新的版本。這時&#xff0c;版本管理工具就顯得尤為重要。pyenv-win就是一款專門為 Windows 系統設計的 Pytho…

MongoDB 常見查詢語法與命令詳解

MongoDB 作為文檔型數據庫&#xff0c;其查詢語言基于 BSON&#xff08;二進制 JSON&#xff09;格式&#xff0c;與傳統關系型數據庫的 SQL 語法有較大差異。 一、基本查詢命令 1. find()&#xff1a;查詢文檔 語法&#xff1a;db.collection.find(查詢條件, 投影)示例&…

AlpineLinux安裝docker

或許你在docker中使用 Alpine Linux 的鏡像使用得多,但是有沒有想過在 Alpine Linux 上安裝 Docker 來使用呢?默認情況下,Docker 包位于社區倉庫中,因此在使用包管理來安裝docker之前建議更換為國內源,并開啟社區倉庫的鏈接。 下面的操作是在root用戶下運行的,如果要使用…

docker安裝gitlab并配置ssl證書

本篇安裝環境 Docker版本&#xff1a;Docker version 28.3.0 域名&#xff1a;test.disallow.cn 自簽證書&#xff1a;/etc/gitlab/ssl&#xff08;已經存放在該目錄&#xff09; 一、拉取鏡像 docker run -itd \--privilegedtrue \--hostname gitlab.test.disallow.cn \--p…

Java開發者轉型AI時代的路徑

Java開發者轉型AI時代的路徑 引言 隨著人工智能技術的飛速發展&#xff0c;AI已不再是遙不可及的未來&#xff0c;而是深刻影響著各行各業的當下。對于Java開發者而言&#xff0c;面對AI浪潮&#xff0c;如何順勢而為&#xff0c;實現職業轉型與技能升級&#xff0c;成為擺在…

QT6 源(140)模型視圖架構里的視圖總基類 QAbstractItemView:

&#xff08;1&#xff09;先給出本類的繼承關系 &#xff1a; &#xff08;2&#xff09;Qt 已經預先為視圖定義了鍵盤功能&#xff0c;Qt 大師們通過編程&#xff0c;已經完善了視圖對鍵盤的響應操作 &#xff1a; &#xff08;3&#xff09;因為本類是抽象基類&#xff0c;無…

vue上傳各種文件,并預覽組件,(預覽,下載),下載resources目錄下文件

前端組件vue 最終效果 <template><div ><div class"file-list" v-if"existingFiles.length > 0"><div class"file-card" v-for"(file, index) in existingFiles" :key"file.id"><div clas…

【CS創世SD NAND征文】SD NAND賦能新一代兒童智能玩具

基于全志F1C100S的高可靠存儲方案 文章目錄 基于全志F1C100S的高可靠存儲方案[toc]前言 一、應用產品介紹&#xff1a;兒童智能玩具的需求演變二、技術方案介紹&#xff1a;構建智能玩具的"大腦"與"記憶庫"三、核心技術模塊分析3.1 主控芯片&#xff1a;全…

mac觸摸板設置右鍵

在 Mac 筆記本上&#xff0c;觸摸板默認沒有物理左右鍵分區&#xff0c;但可以通過以下方式實現“右鍵”功能&#xff08;稱為 輔助點按&#xff09;&#xff1a; 一、啟用與使用右鍵&#xff08;輔助點按&#xff09; 步驟1&#xff1a;檢查系統設置 點擊屏幕左上角 &#x…

穩定幣發行量創紀錄地超過 Visa 交易量

穩定幣發行量創紀錄地超過 Visa 交易量 穩定幣的崛起正在重塑全球金融格局&#xff0c;華夏基金首席執行官甘天&#xff08;Gan Tian&#xff09;強調了穩定幣的快速增長&#xff0c;并指出穩定幣的交易量在短短五年內就超過了Visa 40年的交易量。這凸顯了貨幣使用的轉變。 穩…

編程 IDE 混戰簡史:從 Copilot 到 Claude Code,一場重塑開發方式的戰爭

unsetunset引言&#xff1a;開發新紀元的序幕unsetunset 編程世界&#xff0c;從最初依賴打孔卡和簡陋的命令行工具&#xff0c;到如今功能琳瑯滿目的集成開發環境&#xff08;IDE&#xff09;&#xff0c;每一步都見證了效率與智能的飛躍。IDE作為開發者與代碼交互的核心界面&…

軟測八股--計算機網絡

計算機網絡基礎 局域網廣域網 局域網&#xff1a;一個區域內由多臺計算機互聯成的計算機組&#xff08;學校&#xff0c;辦公室&#xff0c;公司/學校等&#xff09;。可以實現文件管理&#xff0c;應用軟件管理&#xff0c;答應及管理&#xff0c;掃描儀共享等。是封閉的&am…

某省職業院校技能大賽 高職組“信息安全管理與評估”賽項第二部分:應急響應

&#xff01;&#xff01;&#xff01;需要環境可私信博主&#xff01;&#xff01;&#xff01; &#xff01;&#xff01;&#xff01;若有錯誤歡迎指正&#xff01;:) 序號任務要求1提交攻擊者的兩個內網IP地址2提交網站管理員用戶的用戶名和密碼3提交黑客得到 mysql 服務的…

OkHttp 簡單配置

OkHttpClient 的簡單配置&#xff0c;包含重試&#xff0c;線程池 Configuration public class OkHttpConfig {Bean("deSourceOkHttp")public OkHttpClient okHttpClient() {return new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS).readTimeout(3…

群暉nas安裝moodle跳坑記錄

1&#xff0c;套件里面直接安裝 會安裝好幾個依賴&#xff0c;包括php apach &#xff0c;數據庫。這些安裝的時間就比較長。 安裝完成后自動安裝 Moodle。 過程也很長數據庫里面的表有接近500張。 2&#xff0c;安裝位置 順便提一下 nas程序的安裝位置 這兩個位置好像都不是…

鴻蒙HarmonyOS 5小游戲實踐:打磚塊游戲(附:源代碼)

打磚塊是一款經典的游戲&#xff0c;它簡單易懂卻又充滿挑戰性。本文將介紹如何使用ArkUI框架開發一個完整的打磚塊游戲&#xff0c;涵蓋游戲邏輯設計、UI實現和交互處理等核心內容。 游戲架構設計 我們的打磚塊游戲采用了組件化設計&#xff0c;主要分為兩個部分&#xff1a;…

Flutter MobX 響應式原理與實戰詳解

&#x1f4da; Flutter 狀態管理系列文章目錄 Flutter 狀態管理(setState、InheritedWidget、 Provider 、Riverpod、 BLoC / Cubit、 GetX 、MobX 、Redux) setState() 使用詳解&#xff1a;原理及注意事項 InheritedWidget 組件使用及原理 Flutter 中 Provider 的使用、注…