文章首發:
結構型模式:代理模式設計模式
七大結構型模式之七:代理模式。微信
姓名 :代理模式網絡
英文名 :Proxy Pattern架構
價值觀 :爲生活加點料框架
我的介紹 :
Provide a surrogate or placeholder for another object to control access to it.
爲其餘對象提供一種代理以控制對這個對象的訪問。
(來自《設計模式之禪》)dom
我們從事 IT 行業,隨時均可能上網查東西,若是網絡速度慢或者網絡訪問受限制,那是至關的折磨,忍無可忍。而咱在國內網絡比較特殊,有個牆圍着,俗稱防火長城。今天講到代理模式,就來說講這道牆。這牆是這麼實現的,咱們上網,正常的網絡是世界各地的網站咱們都能訪問,而加上這道牆,至關於在咱們上網的時候作了一層代理,這一層代理把禁用的網站給過濾掉,使得咱們無法訪問被禁用的網站。下面經過代碼來說解。機器學習
定義一個互聯網接口,裏面有一個訪問網站的通用方法 access
。ide
/** * 互聯網 */ 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 等教程
加我的微信備註『教程』獲取架構師、機器學習等教程