初識設計模式(代理模式)

前言:設計模式繼續,今天學習代理模式。html

代理模式(Proxy)

代理要作的就是:控制和管理訪問。代理其實就是真實對象的表明。java

定義:爲其餘對象提供一種代理以控制對這個對象的訪問。設計模式

目的:能達到的目的是爲一個對象擴展功能。數組

結構圖:瀏覽器

1、如何理解控制訪問?

  好比遠程代理控制訪問,其實就是控制網絡上的細節。控制訪問遠程對象。安全

  好比虛擬代理控制訪問建立開銷大的資源。服務器

  好比保護代理基於權限控制對資源的訪問。網絡

2、java 代理模式分類:

  靜態代理:在編譯期就已經存在代理類。缺點是:目標類接口變動,須要修改代理類。性能

  jdk 動態代理:運行時動態生成代理類,使用反射進行方法的調用。缺點是:只可以代理實現了接口(InvocationHandler)的目標類。深刻理解JDK動態代理機制。學習

  cglib 動態代理:使用字節碼動態生成代理類,底層將方法所有存入一個數組中,經過數組索引直接進行方法調用。缺點是:不能對final類以及final方法進行代理

  找到一篇例子:Java的三種代理模式簡述

  在 Spring 的 AOP 實現中,主要應用了 JDK 動態代理以及 CGLIB 動態代理。若是代理對象實現了接口,則默認使用jdk動態代理,也可強制使用cglib代理,若是未實現接口則只能使用cglib代理。

  動態代理,咱們不知道要針對哪一個接口、哪一個被代理類建立代理類,由於它是在運行時被建立的。

3、應用場景:

  一、遠程代理,也就是爲一個對象在不一樣的地址空間提供局部表明。這樣能夠隱藏一個對象存在於不一樣地址空間的事實。(下面有講解)  

  二、虛擬代理,是根據須要建立開銷很大的對象。經過它來存放實例化須要很長時間的真實對象。來達到性能的最優化。

  好比:打開一個很大的 HTML 網頁時,裏面可能有不少的文字和圖片,但咱們仍是能夠很快打開它,此時咱們所看到的是全部的文字,但圖片倒是一張一張地下載後才能看到。那些未打開的圖片框,就是經過虛擬代理來替代了真實的圖片,此時代理存儲了真實的路徑和尺寸。因此瀏覽器當中是經過代理模式來優化下載的。

  三、安全代理(保護代理),用來控制真實對象訪問的權限。

  四、智能指引,是指當調用真實的對象時,代理處理另一些事。

  好比:計算真實對象的引用次數,這樣當該對象沒有引用時,能夠自動釋放它;或當第一次引用一個持久對象時,將它裝入內存;或在訪問一個實際對象前,檢查是否已經鎖定它,以確保其餘對象不能改變它。它們都是經過代理在訪問一個對象時附加一些內務處理。  

一、遠程代理

  我理解的就是,本身的服務器須要訪問(使用代理訪問)另外一個服務器上的對象。也就是在本身的 JVM 環境裏調用代理對象的方法,由代理對象去經過網絡或者 I/O 來訪問真實的對象,這裏的代理對象存在於本身的 JVM 環境裏。

  簡單來講,當你想在本身的 JVM 環境裏訪問一個對象的方法,可是這個對象在另外一個 JVM 堆裏,若是要訪問,則須要經過網絡來實現。這時使用遠程代理,在本身的 JVM 裏新建一個代理對象,我調用的就是這個代理對象的方法,我並不須要知道這時是由代理對象來負責經過網絡來訪問真實的那個對象。

代理對象如何調用遠程的對象?有一種方法是使用 RMI,這裏簡單講一下 RMI。

  java 的 RMI 能夠作到。不過如今用的不多了吧。

  RMI 提供了客戶輔助對象(代理對象)、服務輔助對象。

  RMI 的好處在於沒必要親自寫人和的網絡或 I/O 代碼。

  如何將對象變爲服務,使之能夠接受遠程的調用?使用 RMI 的一些東西,須要瞭解 RMI 的知識。

  RMI 過程:由客戶調用客戶輔助對象 -> 客戶輔助對象經過網絡調用服務輔助對象 -> 服務輔助對象調用真實的服務對象

  

4、擴展一下反向代理、正向代理 

  在公司,常常聽到反向代理,正向代理,因此這兩個又是啥?

  反向代理,正向代理其實都是代理模式。

  正向代理:是一個位於客戶端和原始服務器(origin server)之間的服務器,爲了從原始服務器取得內容,客戶端向代理髮送一個請求並指定目標(原始服務器),而後代理向原始服務器轉交請求並將得到的內容返回給客戶端。客戶端才能使用正向代理。

  反向代理(Reverse Proxy):方式是指以代理服務器來接受 internet 上的鏈接請求,而後將請求轉發給內部網絡上的服務器,並將從服務器上獲得的結果返回給 internet 上請求鏈接的客戶端,此時代理服務器對外就表現爲一個反向代理服務器。

  正向代理和反向代理不一樣之處在於,典型的正向代理是一種最終用戶知道並主動使用的代理方式。例如Chrome瀏覽器中安裝了switchysharp之後,經過switchysharp方便地進行代理轉發服務。而爲此用戶必需要提早在switchysharp中作好設置才能達到相應的效果。

  這裏附上我在網上看到的一篇容易理解的文章:正向代理與反向代理【總結】

相關文章
相關標籤/搜索