結構型模式:代理模式

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

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

簡介

姓名 :代理模式網絡

英文名 :Proxy Pattern架構

價值觀 :爲生活加點料框架

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

你要的故事

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

定義一個互聯網接口,裏面有一個訪問網站的通用方法 accesside

/**
 * 互聯網
 */
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

相關文章
相關標籤/搜索