設計模式使用場景實現示例及優缺點(結構型模式——代理模式、外觀模式)

結構型模式

代理模式(Proxy Pattern)

代理模式(Proxy Pattern)是一種結構型設計模式,它通過引入一個代理對象來控制對另一個對象的訪問。這個代理對象可以為被代理的對象提供額外的功能,例如訪問控制、延遲初始化、日志記錄、或網絡訪問等。

適用場景

  1. 遠程代理

    • 為一個對象在不同的地址空間提供局部代表。
  2. 虛擬代理

    • 根據需要創建開銷很大的對象。
  3. 保護代理

    • 控制對原始對象的訪問。
  4. 智能指引

    • 在訪問對象時執行一些附加操作,例如計數操作或引用檢測。

實現示例(Java)

以下是一個簡單的代理模式的實現示例,展示如何通過代理對象控制對實際對象的訪問。

1. 定義主題接口
public interface Subject {void request();
}
  • 說明Subject 接口定義了一個 request 方法,這是實際對象和代理對象都需要實現的方法。
2. 定義真實主題類(RealSubject)
public class RealSubject implements Subject {public void request() {System.out.println("RealSubject: Handling request.");}
}
  • 說明RealSubject 類實現了 Subject 接口的 request 方法,表示真實處理請求的類。
3. 定義代理類(Proxy)
public class Proxy implements Subject {private RealSubject realSubject;public Proxy(RealSubject realSubject) {this.realSubject = realSubject;}public void request() {if (this.checkAccess()) {this.realSubject.request();this.logAccess();}}private boolean checkAccess() {// 檢查訪問權限System.out.println("Proxy: Checking access prior to firing a real request.");return true;}private void logAccess() {// 記錄請求日志System.out.println("Proxy: Logging the time of request.");}
}
  • 說明
    • Proxy 類實現了 Subject 接口,并持有一個 RealSubject 對象。
    • request 方法中,代理類先檢查訪問權限,再調用真實對象的 request 方法,最后記錄請求日志。
4. 客戶端代碼
public class Client {public static void main(String[] args) {RealSubject realSubject = new RealSubject();Proxy proxy = new Proxy(realSubject);proxy.request();}
}
  • 說明
    • Client 類創建了 RealSubjectProxy 對象,通過 Proxy 對象調用 request 方法,從而控制對 RealSubject 的訪問。

優點

  1. 隔離性

    • 代理模式可以作為調用者和實際對象之間的中介,降低系統組件之間的耦合度,增強對象間的隔離性。
  2. 安全性

    • 通過代理可以控制對實際對象的訪問,實現安全檢查以及深度驗證。
  3. 擴展性

    • 代理模式在不修改具體對象代碼的情況下,可以靈活地增加功能。
  4. 智能化

    • 可以在不改變服務對象接口的前提下,實施一些附加操作,如延遲初始化和訪問日志等。

缺點

  1. 代碼復雜性

    • 引入代理也意味著增加了系統的復雜性,可能會引入新的類和接口,增加了代碼的理解和維護成本。
  2. 響應時間

    • 代理模式可能會導致系統運行速度減慢,特別是在代理操作中加入了大量處理邏輯時。
  3. 設計難度

    • 正確地設計和實施代理模式需要仔細考慮整個系統的設計,以確保不會對系統性能產生負面影響。

類圖

Client|v
Subject <---- Proxy <---- RealSubject

總結

代理模式提供了一種有效的方式來控制和管理對象的訪問。通過使用代理,可以在保持業務對象職責清晰的同時,增加各種功能。此模式特別適用于需要對業務對象進行訪問控制和其他預處理操作的場景。

外觀模式(Facade Pattern)

外觀模式(Facade Pattern)是一種結構型設計模式,它通過提供一個統一的接口,用來訪問子系統中的一群接口,從而讓復雜子系統更容易使用。外觀模式定義了一個高層接口,使得這一子系統更加容易使用。

適用場景

  1. 簡化復雜系統的接口

    • 為復雜的子系統提供一個簡單的接口,減少外部與子系統的交互復雜度。
  2. 層次結構

    • 在多層系統結構中,可以使用外觀模式定義每層的入口,簡化層之間的依賴關系。
  3. 解耦系統

    • 通過引入外觀模式,使得子系統與客戶端之間的耦合度降低。

實現示例(Java)

以下是一個簡單的外觀模式的實現示例,展示如何通過外觀類簡化對子系統的使用。

1. 定義子系統類
public class SubsystemA {public void operationA() {System.out.println("SubsystemA: operationA");}
}public class SubsystemB {public void operationB() {System.out.println("SubsystemB: operationB");}
}public class SubsystemC {public void operationC() {System.out.println("SubsystemC: operationC");}
}
2. 定義外觀類
public class Facade {private SubsystemA subsystemA;private SubsystemB subsystemB;private SubsystemC subsystemC;public Facade() {this.subsystemA = new SubsystemA();this.subsystemB = new SubsystemB();this.subsystemC = new SubsystemC();}public void operation1() {System.out.println("Facade: operation1");subsystemA.operationA();subsystemB.operationB();}public void operation2() {System.out.println("Facade: operation2");subsystemB.operationB();subsystemC.operationC();}
}
3. 客戶端代碼
public class Client {public static void main(String[] args) {Facade facade = new Facade();facade.operation1();facade.operation2();}
}

注釋說明

  1. 子系統類

    • SubsystemA, SubsystemB, 和 SubsystemC 是子系統的具體實現類,每個類都有自己獨特的操作方法。
  2. 外觀類

    • Facade 類持有子系統的對象,并提供簡化的接口 operation1operation2 來調用子系統的功能。
  3. 客戶端代碼

    • Client 類通過 Facade 類來調用 operation1operation2,從而簡化了對復雜子系統的使用。

優點

  1. 簡化接口

    • 外觀模式為子系統提供了一個簡單的接口,減少了與子系統交互的復雜度。
  2. 松散耦合

    • 外觀模式使得子系統與客戶端之間的耦合度降低,有助于提高系統的可維護性和擴展性。
  3. 更好的分層

    • 外觀模式有助于建立一個清晰的分層結構,定義每層的入口。

缺點

  1. 不符合開閉原則

    • 增加新的子系統功能時,可能需要修改外觀類,違背了開閉原則(對擴展開放,對修改關閉)。
  2. 可能造成性能問題

    • 在某些情況下,使用外觀模式可能會導致系統性能下降,因為所有請求都需要經過外觀類。

類圖

Client|v
Facade ----> SubsystemA----> SubsystemB----> SubsystemC

總結

外觀模式通過提供一個簡化的接口,使得復雜子系統的使用變得更加容易。它適用于需要簡化子系統接口、減少客戶端與子系統直接交互、解耦系統層次結構的場景。盡管它有可能違反開閉原則,但在大多數情況下,它的優點遠遠超過其缺點,使得系統設計更加清晰和易于維護。

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

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

相關文章

力扣844.比較含退格的字符串

力扣844.比較含退格的字符串 棧模擬 class Solution {public:bool backspaceCompare(string s, string t) {int n s.size(),m t.size();stack<char> s1,s2;for(int i0;i<n;i){s1.push(s[i]);if(s[i] #){if(s1.size() 1) s1.pop();else s1.pop(),s1.pop();}}for(i…

利用Python的sympy包求解一元多次方程

一元1次方程 import sympy as sp # 導入sympy包 x sp.Symbol(x) # 定義符號變量 f 2*x -8 # 定義要求解的一元1次方程 x sp.solve(f) # 調用solve函數求解方程 x[4]一元2次方程 import sympy as sp # 導入sympy包 x sp.Symbol(x) # 定義符號變量 f …

網絡安全合規建設

網絡安全合規建設 一、法律安全需求基本合規&#xff08;1&#xff09;《網絡安全法》重要節點等級保護政策核心變化 二、安全需求 業務剛需&#xff08;1&#xff09;內憂&#xff08;2&#xff09;外患 三、解決方法&#xff08;1&#xff09;總安全戰略目標圖&#xff08;2&…

廣匯汽車:救得起來嗎?

五折奔馳、六折寶馬...BBA們“腰斬式”大降價后正在引發連鎖反應。 國內第二大汽車經銷商——廣匯汽車&#xff0c;還好嗎&#xff1f; 受新能源品牌沖擊&#xff0c;近年來奔馳、寶馬等豪華燃油品牌銷量低迷&#xff0c;紛紛開啟降價模式&#xff0c;首當其沖的就是以廣匯汽車…

使用Python實現深度學習模型:跨平臺模型移植與部署

引言 隨著深度學習技術的快速發展,模型的跨平臺移植與部署變得越來越重要。無論是將模型從開發環境移植到生產環境,還是在不同的硬件平臺上運行,跨平臺部署都能顯著提高模型的實用性和可擴展性。本文將介紹如何使用Python實現深度學習模型的跨平臺移植與部署,并提供詳細的…

QT TCP多線程網絡通信

學習目標&#xff1a; TCP網絡通信編程 學習前置環境 運行環境:qt creator 4.12 QT TCP網絡通信編程-CSDN博客 Qt 線程 QThread類詳解-CSDN博客 學習內容 使用多線程技術實現服務端計數器 核心代碼 客戶端 客戶端&#xff1a;負責連接服務端&#xff0c;每次連接次數1。…

從零開始做題:MP3

題目 給出一個mp3文件 解題 右鍵->selection->save selection->另存為xxx.png即可 8750d5109208213f E:\逐鹿\MISC\tools\MP3Stego_1_1_19\MP3Stego>.\decode -X cipher.mp3 MP3StegoEncoder 1.1.19 See README file for copyright info Input file cipher.mp3…

未來代理IP的發展趨勢:創新、適應和可持續性

你是否好奇&#xff0c;未來代理IP將如何演變以適應日益復雜和全球化的網絡環境&#xff1f;讓我們探討一下代理IP技術在創新、適應性和可持續發展方面的未來前景。 1. 創新技術驅動 未來的代理IP將依托創新技術&#xff0c;如邊緣計算、區塊鏈和深度學習。邊緣計算技術的應用…

AcWing 5458:進水排水問題

【題目描述】 某已經蓄滿水的泳池內裝有 4 個水管。 前 2 個水管是進水管&#xff0c;單位時間的進水量分別為 a,b。 后 2 個水管是排水管&#xff0c;單位時間的排水量分別為 c,d。 請你計算&#xff0c;當 4 個水管同時工作時&#xff0c;是否可能將泳池里的水排干。【輸入格…

53-5 內網代理7 - CS上線不出網主機

靶場搭建: 這里就用之前內網代理的靶場,把web服務器這臺虛擬機關閉掉,用剩下的3臺加kali 各個虛擬機的網絡情況 kali - 可以連接外網win2008(之前的FTP服務器) 可以連接外網 win 7(之前的辦公電腦) 不出網主機 - 無法連接外網win2012 克隆機(之前的域控) - 無法連接…

視頻壓縮文件太大了怎么縮小?3個壓縮方法分享

視頻壓縮文件太大了怎么縮小&#xff1f;當視頻壓縮文件過大時&#xff0c;縮小其大小不僅能節省寶貴的存儲空間&#xff0c;還能顯著提升文件傳輸速度&#xff0c;特別是在網絡條件有限的情況下。通過專業的視頻壓縮軟件&#xff0c;可以有效減少文件體積&#xff0c;使視頻內…

python庫(9):prettytable庫快速實現ASCII表格

下面介紹一個快速制作ASCII表格庫——prettytable&#xff0c;可以方便地制作簡單表格。 1 安裝prettytable pip install -i https://pypi.tuna.tsinghua.edu.cn/simple prettytable 結果如下&#xff1a; 2 代碼實例 from prettytable import PrettyTable table PrettyTa…

【Python系列】深入解析 Python 中的 JSON 處理工具

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

兼容MySQL和PostgreSQL協議的數據庫

兼容MySQL和PostgreSQL協議的數據庫 一、Aurora二、TDSQL數據庫三、TDSQL-C數據庫四、TDSQL-C MySQL 版和 TDSQL MySQL 版的區別 一、Aurora Aurora是由亞馬遜網絡服務&#xff08;AWS&#xff09;提供的一種關系型數據庫引擎。它是在MySQL和PostgreSQL之上構建的&#xff0c;…

coco數據集格式計算mAP的python腳本

目錄 背景說明COCOeval 計算mAPtxt文件轉換為coco json 格式自定義數據集標注 背景說明 在完成YOLOv5模型移植&#xff0c;運行在板端后&#xff0c;通常需要衡量板端運行的mAP。 一般需要兩個步驟 步驟一&#xff1a;在板端批量運行得到目標檢測結果&#xff0c;可保存為yol…

【Django項目】基于Python+Django+MySQL的音樂網站系統項目

功能介紹 首頁&#xff1a;歌曲分類、歌曲搜索、熱門歌曲、熱門下載、新歌推薦 歌曲排行&#xff1a;歌曲分類、分頁功能 用戶板塊&#xff1a;用戶登陸/注冊、播放歷史 歌曲詳情&#xff1a;歌曲播放、當前播放列表、歌曲點評、歌曲播放插件、下載歌曲 系統后臺&#xff1a;歌…

MySQL體系架構解析

1.MySQL體系架構 1.1.MySQL的分支與變種 MySQL變種有好幾個,主要有三個久經考驗的主流變種:Percona Server,MariaDB和 Drizzle。它們都有活躍的用戶社區和一些商業支持,均由獨立的服務供應商支持。同時還有幾個優秀的開源關系數據庫,值得我們了解一下。 1.1.1.Drizzle …

【Sql Server修改列類型錯誤信息:對象名依賴于列】

Sql Server修改列類型錯誤信息&#xff1a;對象名依賴于列 報錯信息解決方法測試sql語句 報錯信息 修改表中列類型&#xff0c;發生報錯如下&#xff1a; [SQL Server]對象DF__Forecast___isCal__4E746892 依賴于 列isCalcFinished。 (5074) [42000] [Microsoft][ODBC Driver…

L2 LangGraph_Components

參考自https://www.deeplearning.ai/short-courses/ai-agents-in-langgraph&#xff0c;以下為代碼的實現。 這里用LangGraph把L1的ReAct_Agent實現&#xff0c;可以看出用LangGraph流程化了很多。 LangGraph Components import os from dotenv import load_dotenv, find_do…

2024年高壓電工證考試題庫及高壓電工試題解析

題庫來源&#xff1a;安全生產模擬考試一點通公眾號小程序 2024年高壓電工證考試題庫及高壓電工試題解析是安全生產模擬考試一點通結合&#xff08;安監局&#xff09;特種作業人員操作證考試大綱和&#xff08;質檢局&#xff09;特種設備作業人員上崗證考試大綱隨機出的高壓…