23種設計模式之一————外觀模式詳細介紹與講解

外觀模式詳細講解

  • 一、概念
  • 二、 外觀模式結構
      • 核心思想及解釋
      • 模式的UML類圖
      • 模式角色
      • 應用場景
      • 模式優點
      • 模式缺點
  • 三、實例演示
      • 圖示
      • 代碼展示
      • 運行結果

一、概念

外觀模式(Facade Pattern)是一種結構型設計模式,它提供了一個統一的接口,用來訪問系統中的一群接口,從而簡化客戶端與系統之間的交互。外觀模式通過引入一個外觀類來封裝子系統的復雜性,使得客戶端只需要與外觀類交互,而無需直接與子系統的各個組件打交道。

二、 外觀模式結構

核心思想及解釋

外觀模式的核心思想是簡化復雜系統的接口。它提供一個統一的接口,客戶端通過這個接口與復雜子系統進行交互,而不需要了解子系統的詳細工作原理。這種模式允許用戶避免直接處理復雜的子系統組件,可以更加簡單地對子系統進行訪問和管理。

模式的UML類圖

在這里插入圖片描述

模式角色

外觀角色(Facade):這是外觀模式的核心角色,它提供了一個簡化的接口,用于訪問子系統中的功能。外觀類的作用是封裝復雜的子系統操作,讓外部客戶端無需了解內部細節就能進行交互。
子系統角色(Subsystem):這些是實際執行具體任務的類或模塊。它們可能包含多個類和更復雜的邏輯,對于客戶端來說,直接與這些子系統交互可能會非常復雜。
客戶角色(Client):客戶端使用外觀類提供的接口與子系統進行交互。通過這種方式,客戶端可以簡化其代碼,因為它只需要與外觀類打交道,而不是直接與復雜的子系統打交道。

應用場景

1.系統復雜度較高:當系統的某一子系統變得過于復雜,不容易使用時,可以使用外觀模式進行簡化。它可以將系統的復雜性內部化,對外提供一個簡單的接口,使得使用者更加容易使用。
2.系統中存在多個包含關系復雜的接口:當系統中存在多個接口之間的依賴關系比較復雜時,外觀模式可以進行封裝,將復雜性內部化,從而簡化其使用和維護。
3.需要對外封閉系統:當系統需要對外封閉,外界只能通過一個統一的接口來訪問系統時,可以使用外觀模式進行封裝,這樣可以有效提高系統的安全性。
4.系統需要進行重構:當系統需要進行重構,需要對原有的代碼進行優化和改進時,可以使用外觀模式進行重構,使得代碼更加易于理解和維護。同時,使用外觀模式可以將系統功能進行重組,減少耦合,從而提高系統的靈活性和可擴展性。
5.簡化系統接口:客戶端需要使用一個簡單易用的接口來操作整個系統,而不需要關心系統的內部實現。
6.封裝復雜邏輯:系統內部的實現非常復雜,需要通過外觀模式來將其封裝起來,從而便于管理和維護。
7.解耦系統組件:系統內部的各個組件之間存在較高的耦合度,需要通過外觀模式來降低其耦合度,從而提高系統的可擴展性和靈活性。

模式優點

  • 簡化接口:客戶端只需與外觀類交互,無需了解系統的復雜性。
  • 解耦客戶端和子系統:外觀類作為中介者,降低了客戶端和子系統之間的耦合度。
  • 提高靈活性:可以隨時修改外觀類以適應系統變化,而不會影響客戶端代碼。

模式缺點

  • 不符合“開閉原則”:如果新增子系統或刪除子系統,可能需要修改外觀角色的代碼,這在一定程度上違反了“開閉原則”。
  • 可能隱藏了子系統的復雜性:如果外觀角色設計得過于復雜,可能會隱藏子系統的復雜性,使得客戶端難以理解和使用。
  • 封裝過度導致靈活性降低:如果外觀類封裝了過多的子系統功能,可能會導致其變得過于龐大和復雜,反而增加了理解和維護的難度。當需要修改系統內部實現時,可能需要修改外觀類,這可能會影響到其他與外觀類交互的客戶端。

三、實例演示

圖示

在這里插入圖片描述

代碼展示

package task1;public class GuaHao {private String keshi;public GuaHao(String keshi) {this.keshi = keshi;}public boolean IsTrue() {if (keshi != null) {return true;} elsereturn false;}}
package task1;public class Menzhen {private GuaHao guaHao;public Menzhen(GuaHao guaHao) {this.guaHao = guaHao;}public String check() {String str = "健胃消食片";if (guaHao.IsTrue()) {//判斷是否掛號return str;} elsereturn null;}}
package task1;public class Huajia {private Menzhen menzhen;public Huajia(Menzhen menzhen) {this.menzhen = menzhen;}public double Getprice() {if (menzhen.check() != null) {System.out.println("開的藥是:"+menzhen.check());return 20;} elsereturn 0;}
}
package task1;public class Pay {private Huajia price;public Pay(Huajia price) {this.price = price;}public boolean IsPay() {System.out.println("已繳費" + price.Getprice());return true;}
}
package task1;public class Medicine {public Pay isPay;public Medicine(Pay isPay) {this.isPay = isPay;}public void GetMedicine() {if (isPay.IsPay()) {System.out.println("已取藥");}}}

然后,我們創建一個外觀類,它將子系統的功能進行封裝:

package task1;public class Facade {private GuaHao guaHao;private Menzhen menzhen;private Huajia huajia;private Pay pay;private Medicine medicine;private String keshi;public Facade(String keshi) {this.keshi = keshi;guaHao = new GuaHao(keshi);menzhen = new Menzhen(guaHao);huajia = new Huajia(menzhen);pay = new Pay(huajia);medicine = new Medicine(pay);}public void check() {System.out.println("掛號:"+keshi);medicine.GetMedicine();}}

最后,我們可以在客戶端代碼中使用外觀類:

package task1;public class Test {public static void main(String[] args){Facade facade = new Facade("內科");facade.check();}}

運行結果

在這里插入圖片描述
在這個示例中,GuaHaoMenzhenHuajiaPayMedicine代表子系統中的不同組件,它們各自負責掛號、門診、劃價、付費和取藥。Facade作為外觀類,提供了一個check()方法,該方法調用了所有必要的子系統操作來檢查,從而簡化了客戶端的使用。客戶端只需要調用外觀類的一個方法,而無需了解每個子系統的具體實現細節。
"博主用心寫,讀者點關注;互動傳真情,知識不迷路

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

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

相關文章

【問題解決】Android Studio Jellyfish新建Kotlin項目后Gradle Sync及Maven下載很慢

創建新項目之后,Gradle Sync和Build都很慢,因為下載Gradle和Maven等工具。 代碼默認配置 settings.gradle.kts pluginManagement {repositories {google {content {includeGroupByRegex("com\\.android.*")includeGroupByRegex("com\\.g…

ASSM是Automatic Segment Space Management(自動段空間管理)解析

ASSM是Automatic Segment Space Management(自動段空間管理)的縮寫,是Oracle數據庫引入的一項重要特性,首次出現在Oracle 9i中。ASSM旨在簡化空間管理和提高數據庫性能,特別是對于表和索引段的空間分配和回收過程。 在…

Android Activity 設計詳解

文章目錄 Android Activity 設計說明1. Activity 的生命周期2. Activity 的啟動模式3. Activity 的通信4. Activity 的布局和視圖管理5. Activity 的配置變化處理6. Activity 的保存和恢復狀態7. Activity 的任務和返回棧 總結 Android Activity 設計說明 在 Android 中&#…

Ansible01-Ansible的概述、實驗環境初始化、Inventory

目錄 寫在前面1. Ansible是什么1.1 簡介與來歷1.2 Ansible的特點1.3Ansible的架構與工作流程1.3.1 ansible 任務執行模式1.3.2 ansible 執行流程1.4 Ansible的模塊 2. Ansible實驗初始化2.1 實驗環境2.2Ansible的安裝2.2.1 Ansible的程序結構 2.3 修改Ansible配置文件2.3.1 配置…

【408精華知識】頁、頁面、頁框、頁幀、內存塊、物理塊、物理頁面還傻傻分不清?

在做題過程中,我們經常能看到頁、頁框、塊等概念,初接觸時,常感覺傻傻分不清,這篇文章將簡潔地介紹它們之間的聯系與區別。 這些概念之間的根本區別,在于是物理上的概念還是邏輯上的概念,也即是虛地址還是實…

匯聚榮:新手做拼多多應該注意哪些事項?

新手在拼多多開店,面臨的是競爭激烈的市場和復雜的運營規則。要想在這個平臺上脫穎而出,必須注意以下幾個關鍵事項。 一、市場調研與定位 深入了解市場需求和競爭對手情況是新手開店的首要步驟。選擇有潛力的細分市場,并針對目標消費者群體進…

華為云服務培訓

一、存儲類服務實踐 是什么: 云硬盤( Elastic Volume Service )是一種為 ECS(彈性云服務器)、BMS(裸金屬服務器) 等計算服務提供持久性存儲的服務。 作用: 它通過數據冗余和緩存加速等多項技術&#xf…

卷積報錯:AttributeError: ‘Conv2d‘ object has no attribute ‘total_ops‘ (已解)

AttributeError: ‘Conv2d’ object has no attribute ‘total_ops’ File "/home/...../..._encoder.py", line 34, in forwardx = self.conv(x)File "/home/...../python3.8/site-packages/torch/nn/modules/module.py", line 1511, in _wrapped_call_im…

Spring系列-03-BeanFactory和Application接口和相關實現

BeanFactory BeanFactory和它的子接口們 BeanFactory 接口的所有子接口, 如下圖 BeanFactory(根容器)-掌握 BeanFactory是根容器 The root interface for accessing a Spring bean container. This is the basic client view of a bean container; further interfaces such …

windows 11上自帶時間管理-番茄工作法

在 Windows 11 中,你可以使用 專注 功能來最大程度地減少干擾,幫助你保持專注。 專注的工作原理 專注時段打開后,將會出現以下情況: 專注計時器將顯示在屏幕上 請勿打擾將打開 任務欄中的應用不會閃爍發出提醒 任務欄中應用的…

內網穿透原理解析

在互聯網信息時代的今天,我們經常會聽到“內網穿透”,卻有很多人對此并不了解,下面小編給大家介紹一下內網穿透的工作原理。 1. 什么是內網穿透? 在了解內網穿透原理之前,我們先說什么是內網穿透。內網,就是在公司或…

SpringCloud系列(23)--手寫實現負載輪詢算法

前言:在上一篇文章中我們介紹了關于負載輪詢算法的原理以及看了源代碼,而本章節內容則是著重于我們自己手寫一個負載輪詢算法 1、分別編寫provider-payment8001、provider-payment8002這兩個子項目的PaymentController類,增加一個/payment/lb…

C++中引用的全面解析與實戰應用

C中的引用作為一種強大的特性,不僅能夠提升代碼的效率和清晰度,還能在一定程度上保障數據的安全性。本文將深入探討引用的各個方面,包括其定義、使用場景、類型、與指針的區別,并通過實例加以說明。 引用的定義與基本概念 引用可…

探究Python中的元組:不可變性與多重用途

元組是 Python 中的另一種重要數據結構,與列表相似,但具有一些關鍵區別。讓我們來詳細了解一下 Python 中的元組,包括基本語法、常用命令、示例代碼、應用場景、注意事項和總結。 基本語法 創建元組 在 Python 中,元組使用圓括…

Py之llama-parse:llama-parse(高效解析和表示文件)的簡介、安裝和使用方法、案例應用之詳細攻略

Py之llama-parse:llama-parse(高效解析和表示文件)的簡介、安裝和使用方法、案例應用之詳細攻略 目錄 llama-parse的簡介 llama-parse的安裝和使用方法 1、安裝 2、使用方法 第一步,獲取API 密鑰 第二步,安裝LlamaIndex、LlamaParse L…

AI爆文寫作:經常做這四個小練習,讓你解鎖爆文標題的秘籍,讓你的標題炸裂吸晴!

文章目錄 一、無法吸引眼球的標題二、標題炸裂的秘籍練習1:洞察受眾的渴望與恐懼。練習2:運用感官語言,用生動的描述和具體細節,在讀者心中勾勒出一幅畫面。練習3:展示變化。練習4:用意外轉折激發好奇心。一、無法吸引眼球的標題 這樣的標題: [如何通過閱讀改變人生」「…

LeetCode 1542.找出最長的超贊子字符串:前綴異或和(位運算)

【LetMeFly】1542.找出最長的超贊子字符串:前綴異或和(位運算) 力扣題目鏈接:https://leetcode.cn/problems/find-longest-awesome-substring/ 給你一個字符串 s 。請返回 s 中最長的 超贊子字符串 的長度。 「超贊子字符串」需…

<string.h>中部分庫函數的模擬實現

前言 嗨&#xff0c;我是firdawn&#xff0c;本章將簡單介紹&#xff0c;<string.h>中部分庫函數的模擬實現&#xff0c;如strncpy&#xff0c;strncat&#xff0c;memcpy&#xff0c;memmove。在本文片末&#xff0c;還講簡單介紹判斷機器大小端的函數實現&#xff0c;…

VSCode SAP Systems配置HTTPS訪問SAP

第一次訪問提示&#xff0c;Self-Signed 證書 解決辦法&#xff1a;https訪問SAP Fiori網站&#xff0c;導出SSL證書為DER格式保存到硬盤上 雙擊DER文件&#xff0c;導入到系統 退出VSCode&#xff0c;再次啟動 Test Connection, 提示 The system URL is using a hostname …

服務器攻防-中間件安全,weblogic(沒怎么搞懂)

1.weblogic-工具 jboss 1.弱口令 直接輸入admin就就去了 2.反序列化&#xff08;不是很懂java) jenkins glassfish 讀密碼文件 讀取 就可以知道它的密碼 我們就可以寫腳本