一、介紹
什麼是代理模式。
慣例,我們先看一下《研磨設計模式》中的介紹——為其他對象提供一種代理以控制對這個對象的通路。代理模式的本質是——控制對象通路。
什麼意思呢?
就是我們每次通路一個對象的時候,實際上去通路這個對象的代理。這個代理實際上就是這個對象的替身,可以實作原本對象絕大多數的功能。隻有當需要某些特殊功能的時候,才去調用原本的對象。這樣一來,在不修改原對象的情況下,就可以在代理對象上實作很多特殊的功能。這些功能基本都屬于通路控制。
這裡所說的代理跟我們平時所說的各種代理,其實就是一個意思。是以說,像jdk動态代理、cglib動态代理這些也都是代理模式的一個展現。
關于jdk動态代理和cglib動态代理的簡單示範可以參考一下我的另一篇博文
二、我的實作
假設我們有一個user表,對應一個實體類user。它有一個字段是passward。現在我們需要控制這個字段的通路權限,隻有它本人才能檢視和修改,管理者也隻能檢視,不能修改。
一般可以采用接口的設計,讓代理類和被代理類都實作同一個接口,但是,這裡示範為了減少耦合,就不這麼做了。如下:
1、很簡單的實體類:
2、很簡單的代理類:
3、我們測試一下:
如上,實作了簡單的權限控制了。
三、虛代理
代理有很多種,如虛代理、遠端代理、copy-on-write、保護代理、cache代理、防火牆代理、同步代理、智能代理等等。
需要仔細了解,可以自行查找相關資料。
不過萬變不離其宗,這些代理都是符合代理模式的思想的。
上面我的實作,示範的是保護代理。這裡再簡要介紹一下虛代理。
什麼是虛代理呢?對于建立開銷很大的對象,用一個建立開銷較小的代理對象代替,一般情況下,這個代理對象足夠應付絕大多數使用者請求。隻有當使用者請求原對象的特殊功能時,才會建立原對象。
《研磨設計模式》介紹了一種很常用的實作:
一個資料表有很多字段,通常隻需要顯示其中幾個字段,這種情況下就需要使用虛代理來進行優化了。如下:
1、這裡用一個接口來統籌目标對象和代理對象,隻有簡單的get/set方法,如下:
2、目标類這裡就不列出了,代理類如下:
------------------------------------------------------------------------------------------------------------------------------------------------------------
ps:如果本篇博文您覺得不錯的話,請别忘了推薦一下,謝謝。