結構型模式:代理模式

来源:https://www.cnblogs.com/liebrother/archive/2019/05/15/10867421.html
-Advertisement-
Play Games

文章首發: "結構型模式:代理模式" 七大結構型模式之七:代理模式。 簡介 姓名 :代理模式 英文名 :Proxy Pattern 價值觀 :為生活加點料 個人介紹 : Provide a surrogate or placeholder for another object to control ...


文章首發:
結構型模式:代理模式

七大結構型模式之七:代理模式。

簡介

姓名 :代理模式

英文名 :Proxy Pattern

價值觀 :為生活加點料

個人介紹
Provide a surrogate or placeholder for another object to control access to it.
為其他對象提供一種代理以控制對這個對象的訪問。
(來自《設計模式之禪》)

你要的故事

咱們從事 IT 行業,隨時都可能上網查東西,如果網路速度慢或者網路訪問受限制,那是相當的折磨,忍無可忍。而咱在國內網路比較特殊,有個牆圍著,俗稱防火長城。今天講到代理模式,就來講講這道牆。這牆是這麼實現的,我們上網,正常的網路是世界各地的網站我們都能訪問,而加上這道牆,相當於在我們上網的時候做了一層代理,這一層代理把禁用的網站給過濾掉,使得我們沒法訪問被禁用的網站。下麵通過代碼來講解。

定義一個互聯網介面,裡面有一個訪問網站的通用方法 access

/**
 * 互聯網
 */
interface Internet {

    String access(String domain);

}

定義世界範圍內的網路類,可以訪問任何存在的網站。

/**
 * 世界網路
 */
class WorldNetwork implements Internet {

    @Override
    public String access(String domain) {
        System.out.println("訪問網站:" + domain);
        return domain + "網站內容";
    }

}

定義中國的網路類,就是代理類,實現牆的功能。disable 對象存儲了在國內禁止訪問的網站,用戶在訪問網站時(也就是調用 access 訪問)先判斷網站是不是在禁用的網站集合裡面,如果是則禁用,如果不是則繼續訪問。

/**
 * 中國網路(就是代理)
 */
class ChinnessNetwork implements Internet {

    private Set<String> disable;

    private Internet internet;

    public ChinnessNetwork(Internet internet) {
        this.internet = internet;
        this.disable = new HashSet<>();
        this.disable.add("www.google.com");
        this.disable.add("www.facebook.com");
    }

    @Override
    public String access(String domain) {
        if (disable.contains(domain)) {
            System.out.println("禁止訪問該網站:" + domain);
            return "禁止訪問該網站:" + domain;
        }
        return internet.access(domain);
    }
}

測試代碼,ChinnessNetwork 作為代理類,WorldNetwork 作為被代理類。

public class ProxyTest {

    public static void main(String[] args) {
        WorldNetwork worldNetwork = new WorldNetwork();
        ChinnessNetwork chinnessNetwork = new ChinnessNetwork(worldNetwork);
        chinnessNetwork.access("www.google.com");
        chinnessNetwork.access("www.baidu.com");
    }

}

列印結果:
禁止訪問該網站:www.google.com
訪問網站:www.baidu.com

看到結果,萬能的 google 被屏蔽在外,我們只能默默用 baidu。

總結

代理模式簡單說就是在原來對象的功能基礎上加上額外的功能,在工作開發中這個很好用,比如我們要統計系統中各方法執行的時間,就可以用代理模式來實現。開源框架中也用得很多,比如 Spring 的 AOP 等等。

上面簡單的分享了代理模式,也是最簡單的一個代理模式,名稱叫靜態代理。在開發中用的最多的是動態代理,基於這篇文章主要講述設計模式的基礎內容,後面找個機會再分享動態代理的內容。

好了,6 篇原則 + 23 篇設計模式已經完結了。所有的文章都整理在『設計模式』菜單裡面,如下圖所示,方便大家忘記了可以再瞄一眼。後面準備把這 29 篇文章整理成 PDF 分享給大家。

設計模式系列

推薦閱讀

結構型模式:裝飾模式

結構型模式:外觀模式

結構型模式:享元模式

公眾號後臺回覆『大禮包』獲取 Java、Python、IOS 等教程
加個人微信備註『教程』獲取架構師、機器學習等教程

LieBrother


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

-Advertisement-
Play Games
更多相關文章
  • 模擬器名稱 連接預設埠夜神安卓模擬器夜神安卓模擬器 62001逍遙安卓模擬器逍遙安卓模擬器 21503BlueStacks(藍疊安卓模擬器)BlueStacks(藍疊安卓模擬器) 5555雷電安卓模擬器雷電安卓模擬器 5555天天安卓模擬器天天安卓模擬器 5037網易MuMu(安卓模擬器)網易Mu ...
  • 今天我們將利用vue的條件指令來完成一個簡易的動態變色功能按鈕 首先我們還是要對vue進行配置,在上篇隨筆中有相關下載教學. 然後我們要在html頁面上搭建三個簡易的按鈕,顏色分別為紫,綠和藍(顏色隨意)其代碼如下: 這裡的@是v-on事件指令,在這裡要在三個按鈕上設置點擊事件 接著我們要進行條件指 ...
  • nodejs版本:v10.14.2 1.首先準備一個簡單的html頁面 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>nodejs顯示html</title> 6 </head> 7 < ...
  • 典型的一個Web應用的生命周期從用戶在瀏覽器輸入一串URL,或者單擊一個鏈接開始(就是訪問一個頁面)。而這個生命周期的結束就是我們關閉這個頁面。 響應流程: 例子(本例來自《javascript:忍者秘籍》) HTML: javascript: ...
  • 1、viewer.js 使用 Demo http://fengyuanchen.github.io/viewerjs/ 2、viewer.js 下載地址 https://github.com/fengyuanchen/viewerjs 3、viewer只能初始化一次,也就是說如果用ajax添加了新的 ...
  • ...
  • 1 2 3 4 5 6 前端壓縮上傳圖片 7 8 9 10 11 12 13 121 122 123 ...
  • 廢話不多說,直接上源碼 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...