1. 程式人生 > >結構型模式:代理模式

結構型模式:代理模式

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

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

簡介

姓名 :代理模式

英文名 :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 等教程
加個人微信備註『教程』獲取架構師、機器學習等教程

相關推薦

結構模式代理模式

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

結構模式代理模式VS裝飾模式

對於兩個模式,首先要說的是,裝飾模式就是代理模式的一個特殊應用,兩者的共同點是都具有相同的介面,不同點則是代理模式著重對代理過程的控制,而裝飾模式則是對類的功能進行加強或減弱,他著重類的功能變化,我們舉例來說明他們的區別。 代理模式 一個著名的短跑運動員有自己的代理人。如

設計模式代理模式的理解

什麼是代理模式 代理模式(英語:Proxy Pattern)是程式設計中的一種設計模式。 所謂的代理者是指一個類別可以作為其它東西的介面。代理者可以作任何東西的介面:網上連線、儲存器中的大物件、檔案或其它昂貴或無法複製的資源。(百度百科) 我們先思考一個問題:如何在不修改一個類的方法

Spring中常用的設計模式代理模式

文章目錄 代理模式 靜態代理 動態代理 Spring AOP的代理模式 代理模式 本質:控制物件訪問 代理模式具有可擴充套件性: 中介隔離作用。 開閉原則,增加

設計模式代理模式(Proxy)

 代理模式:為其他物件提供一種代理以控制對這個物件的訪問。 代理模式中的角色: 抽象主題角色(Subject):聲明瞭目標物件和代理物件的共同介面,這樣一來在任何可以使用目標物件的地方都可以使用代理物件。 具體主題角色(RealSubject):也稱為

設計模式代理模式(Proxy Pattern)

一、類圖 二、模式定義 代理模式: 給某一個物件提供一個代理或佔位符,並由代理物件來控制對原物件的訪問。 三、模式角色 (1) Subject(抽象主題角色): 它聲明瞭真實主題和代理主題的共同介面,這樣一來在任何使用真實主題的地方都可以使用代理主題,客戶端通

設計模式代理模式是什麼,Spring AOP還和它有關係?

接著學習設計模式系列,今天講解的是代理模式。 定義 什麼是代理模式? 代理模式,也叫委託模式,其定義是給某一個物件提供一個代理物件,並由代理物件控制對原物件的引用。它包含了三個角色: Subject:抽象主題角色。可以是抽象類也可以是介面,是一個最普通的業務型別定義。 RealSubject:具體主題角色,也

結構代理模式及相關應用

文章目錄 代理(Proxy) 優缺點 應用場景 靜態代理 動態代理 CGLIB代理 Spring的代理選擇 參考資料 代理(Proxy) 代

Java設計模式(九)之結構模式外觀模式

一、定義: 所謂外觀模式,就是提供一個統一的介面,用來訪問子系統中的一群介面。 外觀模式定義了一個高層介面,讓子系統更容易使用。如下圖,是使用外觀模式後將子系統的使用變得更加簡單。 在引入外觀模式後,客戶只需要與外觀角色打交道,客戶與子系統的複雜關係由外觀角色來實現

結構模式代理模式

6.1 模式動機: 在某些情況下,一個客戶不想或者不能直接引用一個物件,此時可以通過一個稱之為“代理”的第三者來實現間接引用。 代理物件可以在客戶端和目標物件之間起到中介的作用,並且可以通過代理物件去掉客戶不能看到的內容和服務或者新增客戶需要的額外服務。

結構模式組合模式(Composite Pattern)

一、設計模式的分類 (如果以前看過關於設計模式的分類的話,這部分可以忽略!) 經過很多大神的總結,目前Java中一共23種經典的設計模式! 按照目的,設計模式可以分為以下三種用途: 1.建立型模式:用來處理物件的建立過程 2.結構型模式:用來處理類或者物件的組

結構模式裝飾模式

結果 什麽 inpu 不同的 滿足 裝飾模式 ebr pro 對象 文章首發: 結構型模式:裝飾模式 七大結構型模式之四:裝飾模式。 簡介 姓名 :裝飾模式 英文名 :Decorator Pattern 價值觀 :人靠衣裝,類靠裝飾 個人介紹 : Attach add

【設計模式代理模式靜態代理,動態代理,spring aop

spring 實現接口 找到 master 代碼 -s result java 統一 代理模式分為靜態代理和動態代理。我們拿鏈家來舉例子,我們本人是真實的對象,有真實的業務需求:需要去找房子;鏈家是中介,是代理類,他來幫我執行找房子的這個操作。 靜態代理:   1.實現一個

C#設計模式結構模式裝飾模式

負責 gzip null pattern 產生 設計師 san 抽象 接口 定義(Decorator Pattern): 動態的給一個對象添加一些額外的職責。就添加功能來說,它相比生成子類更為靈活。 一、引言 在軟件開發中,我們經常想要對一類對象添加不同的功能,例如要給手

23種設計模式(23)代理模式

public 附加 ade 調用 action new 參與 proxy inter 概述: 為其他對象提供一種代理以控制對這個對象的訪問。 類型:結構型模式。 類圖: 適用性: 1.遠程代理(RemoteProxy)為一個對象在不同的地址空間提供局部代表。 2

Java設計模式(五)之建立模式原型模式

一、定義: 用原型例項指定建立物件的種類,並通過拷貝這些原型建立新的物件。 UML類圖: 原型模式主要用於物件的複製,它的核心是就是類圖中的原型類Prototype。Prototype類需要具備以下兩個條件: (1)實現Cloneable介面:在java語言有一個Cloneab

Java設計模式(一)之建立模式工廠模式(簡單工廠模式+工廠方法模式

在面向物件程式設計中, 最通常的方法是一個new操作符產生一個物件例項,new操作符就是用來構造物件例項的。但是在一些情況下, new操作符直接生成物件會帶來一些問題。舉例來說,許多型別物件的建立需要一系列的步驟:你可能需要計算或取得物件的初始位置;選擇生成哪個子物件例項;或在你生成你需要的物件

7、設計模式(結構)之橋接模式

作用 將抽象部分與實現部分分離,使它們都可以獨立的變化 何時使用 實現系統可能有多個角度分類,每一種角度都可能變化 優點 抽象和實現的分離 優秀的擴充套件能力 實現細節對客戶透明 例項 下面

設計模式6代理模式

代理模式 何為代理模式?顧名思義可以簡單理解為代為管理,代理模式就是為其他物件提供額外服務,控制訪問(前置處理),或做善後處理(後置處理)。有了代理之後,可以在原來功能的基礎上由代理完成另外一部分事情。 這麼說估計還是有點難理解,那我舉個簡單栗子吧。比如英雄聯盟週年盛典要

設計模式(四)代理模式

前言 國內程式設計師好像普遍對百度都沒好感,而且百度近些年產生了不少負面的新聞,像16年的魏則西事件,近期的導演吳京黑白照事件,以及最近作家六六斥百度李彥巨集:“你是做搜尋引擎還是騙子首領”,還有一件就是與程式設計師有關的:搜尋Julia語言,在百度和Google得出首條搜尋結果的差異性而被吐槽。Google