代理設計模式還不會?2分鐘搞定

来源:https://www.cnblogs.com/mhg215/archive/2023/02/27/17151404.html
-Advertisement-
Play Games

概述 代理模式就是給某一個對象提供一個代理,並由代理對象控制對原對象的引用。在一些情況下,一個客戶不想或者不能直接引用一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。例如電腦桌面的快捷方式就是一個代理對象,快捷方式是它所引用的程式的一個代理。 代理模式一般又分為安全代理,虛擬代理 ,遠 ...


概述

代理模式就是給某一個對象提供一個代理,並由代理對象控制對原對象的引用。在一些情況下,一個客戶不想或者不能直接引用一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。例如電腦桌面的快捷方式就是一個代理對象,快捷方式是它所引用的程式的一個代理

代理模式一般又分為安全代理,虛擬代理 ,遠程代理。

類圖

需求

老王想邀請馬冬梅喝酒,抽煙,穿JK,但老王不善言談,有點羞澀,只能讓其秘書出面邀請,最後他陪馬冬梅抽煙,喝酒、穿JK。

使用代理模式的代碼

public class ClassFlower
{
    public string  Name { get; set; }
    public ClassFlower(string name)
    {
        Name=name;
    }
}
/// <summary>
/// 不管是代理還是十幾人都需要做的共同動作
/// </summary>
public interface ISubject
{
    void GiveSmoking();
    void GiveBeer();
    void GiveJK();
}
/// <summary>
/// 實際人
/// </summary>
public class RealLaoWang : ISubject
{
    private readonly ClassFlower _classFlower;

    public RealLaoWang(ClassFlower classFlower)
    {
        _classFlower = classFlower;
    }
    public void GiveBeer()
    {
        Console.WriteLine($"{_classFlower.Name}:請你喝酒");
    }

    public void GiveJK()
    {
        Console.WriteLine($"{_classFlower.Name}:請你穿JK");
    }

    public void GiveSmoking()
    {
        Console.WriteLine($"{_classFlower.Name}:請你抽煙");
    }
}
/// <summary>
/// 代理人
/// </summary>
public class Proxy : ISubject
{
    private readonly RealLaoWang _realLaoWang;

    public Proxy(RealLaoWang realLaoWang)
    {
        _realLaoWang = realLaoWang;
    }
    public void GiveBeer()
    {
        _realLaoWang.GiveBeer();
    }

    public void GiveJK()
    {
        _realLaoWang.GiveJK();
    }

    public void GiveSmoking()
    {
        _realLaoWang.GiveSmoking();
    }
//C#控制台調用
ClassFlower classFlower = new ClassFlower("馬冬梅");
RealLaoWang realLaoWang=new RealLaoWang(classFlower);
// 生成代理對象,傳入被代理的對象
Proxy proxy=new Proxy(realLaoWang);
ISubject subject = proxy;
subject.GiveBeer();
subject.GiveJK();
subject.GiveSmoking();  

代理模式的優缺點

優點:

  1. 代理模式能夠將調用用於真正被調用的對象隔離,在一定程度上降低了系統的耦合度;
  2. 代理對象在客戶端和目標對象之間起到一個中介的作用,這樣可以起到對目標對象的保護。代理對象可以在對目標對象發出請求之前進行一個額外的操作,例如許可權檢查等。

缺點:

  1.  由於在客戶端和真實主題之間增加了一個代理對象,所以會造成請求的處理速度變慢。
  2. 實現代理類也需要額外的工作,從而增加了系統的實現複雜度。

總結

到這裡,代理模式的介紹就結束了,代理模式就是提供了對目標對象訪問的代理,有沒有發現、設計模式越往後面學習越簡單,當然了,有可能也越學越暈,如果發現比較學習的比較亂、暈,建議前面的文章多看幾遍,自己舉例實操反覆練習鞏固下。

作者:realyrare

出處:https://www.cnblogs.com/mhg215/

聲援博主:如果您覺得文章對您有幫助,請點擊文章末尾的【關註我】吧!

別忘記點擊文章右下角的【推薦】支持一波。~~~///(^v^)\\\~~~ .

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

如果您有其他問題,也歡迎關註我下方的公眾號,可以聯繫我一起交流切磋!

碼雲:碼雲      github:github


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、低配logging 日誌總共分為以下五個級別,這個五個級別自下而上進行匹配 debug-->info-->warning-->error-->critical,預設最低級別為warning級別。 1.v1 import logging logging.debug('調試信息') logging. ...
  • 當前IDEA的版本,已經更新到2022.3.x,本文為大家帶來最新版IDEA的激活破解方式。此激活方式,支持PyCharm、WebStorm、PhpStorm、RubyMine等Jetbrains家的其他同類IDE。此激活工具,向下相容,即 2022.3 之前的版本,也都可以使用此方式激活。 ...
  • Android ADB 備忘清單 ADB,Android Debug Bridge,包含在 Google 的 Android SDK 中,可用於從電腦控制您的 Android 設備。以下是您可以與 ADB 一起使用的一些最常見的命令及其用法入門,為開發人員分享快速參考備忘單。 開發速查表大綱 入門 ...
  • 背景 大家好,我是棧長。 前些天,棧長給大家分享了兩篇有意思的文章: 帶了一個 3 年的開發,不會迴圈刪除 List 中的元素,我簡直崩潰!! 面試官:怎麼去除 List 中的重覆元素?我一行代碼搞定,趕緊拿去用! 這兩篇文章確實能幫助一大部分人,其中分享的一些實現技巧,編程很多年的高手也不一定用過 ...
  • Java方法:方法的重載、命令行傳參、遞歸 方法的重載 重載就是在一個類中,有相同的函數名稱,但是形參不同的函數。 方法重載的規則: 方法名稱必須相同; 參數列表必須不同(個數不同或者類型不同或者參數排列順序不同等); 方法的返回類型可以相同也可以不相同; 僅僅返回類型不同不足以成為方法的重載。 實 ...
  • 問題描述: 編譯器無法使用cmd命令來執行py文件,結果可能報ModuleNotFoundError的錯誤。 比如在cmd任務欄執行:python E:\myProgram\Python\spider\NetDealer\core\others\audi.py,項目NetDealer 包core 文 ...
  • 1.年輕代存活的對象太多,老年代了放不下 01.示例代碼 public class DemoTest1 { public static void main(String[] args) { byte[] array1 = new byte[4 * 1024 * 1024]; array1 = nul ...
  • 一:背景 1. 講故事 前段時間微信上有一位老朋友找到我,說他的程式跑著跑著記憶體會突然爆高,有時候會下去,有什麼會下不去,懷疑是不是某些情況下存在記憶體泄露,讓我幫忙分析一下,其實記憶體泄露方面的問題還是比較好解決的,看過這個dump之後覺得還是有一定的分享價值,拿出來和大家分享一下吧。 二:WinDb ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...