結構型模式:代理模式

LieBrother發表於2019-05-15

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

結構型模式:代理模式

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

簡介

姓名 :代理模式

英文名 :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

相關文章