Proxy:代理模式
先代碼
共用接口:
package h.l.demo.proxy;
/**
*
* @author: Is-Me-Hl
* @date: 2020年2月15日
* @Description: 真實類和代理類的共用接口
*/
public interface Subject {
// 公共行爲
public void request();
}
被代理類及代理類:
package h.l.demo.proxy;
/**
*
* @author: Is-Me-Hl
* @date: 2020年2月15日
* @Description: 被代理的類,實現了公共的接口
*/
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("被代理類的行爲...");
}
}
package h.l.demo.proxy;
/**
*
* @author: Is-Me-Hl
* @date: 2020年2月15日
* @Description: 代理類
*/
public class Proxy implements Subject {
private RealSubject realSubject;
@Override
public void request() {
if (realSubject == null) {
realSubject = new RealSubject();
}
realSubject.request();
}
}
測試類:
package h.l.demo.proxy;
/**
*
* @author: Is-Me-Hl
* @date: 2020年1月31日
* @Description: 測試
*/
public class TestMainEnter {
public static void main(String[] args) {
Proxy proxy = new Proxy();
proxy.request();
}
}
測試結果:
後分析
- 個人建議:寫代碼是件幸福的事,So,do it
代理模式,爲其他對象提供一種代理以控制對這個對象的訪問。從上面的Demo中就可以看出,Proxy代理類實際上是實現了相同的接口,在對應的行爲中,用被代理類去調用了對應的行爲。聯繫生活實際,和網上黃牛代購是一樣的。怎麼理解呢,比如說演唱會門票,實際上官方有提供給大家購票通道,但一般熱門的演唱會老百姓好像也很難能從官方入口買到票,因爲絕大部分的票都被黃牛搶了。我們從黃牛手中買到的票實際上就是官方賣給我們的票。這就是代理的一個過程,舉例好像不是很切當,哈哈,那自個就看代碼理解理解~。反正就表達那個意思對吧,大家都懂的。還有希望相關機關對黃牛這塊能多多監管,別讓黃牛再炒票了!!!
代理模式一般用在什麼場合:
- 遠程代理,也就是一個對象可以在不同的地址空間提供局部代表,這樣可以隱藏一個對象存在於不同地址空間的事實。在我們的項目中使用WebService可以生成響應的文件夾和一些文件,其實他們就是代理,使得客戶端程序調用代理就可以解決遠程訪問的問題。
- 虛擬代理,是根據需要創建開銷很大的對象。通過它來存放實例化需要很長時間的真實對象。比如說打開一個很大的HTML網頁,裏面有大量的文字和圖片,但你還是可以很快的打開它,此時你所看到的是所有的文字,但圖片確實一張張下載後纔可以看到,哪些位打開的圖片呢,就是通過虛擬代理來代替了真實的圖片,此時代理存儲了圖片的路徑和尺寸,瀏覽器中就是使用代理模式優化下載的。
- 安全代理,用來控制真實對象訪問時的權限。
- 智能指引,是指當調用真實對象時,代理處理另外一些事。如在訪問一個對象前,可以附加一些內務處理。
實際上,看了代理模式的Demo,你會覺得裝飾者模式好像和代理模式挺像的,都是拿被操作對象,進行一些列操作。網上也有一系列的文章在解釋這兩者有什麼區別,其實區別就在於兩個模式的使用時爲了什麼。裝飾者模式是爲了增強某個方法,比如說,手機可以打電話,使用裝飾者模式後手機還可以聽音樂,看電影等。代理模式,則是強調對對象的控制,比如小明要打電話,那麼使用代理模式後,小明的祕書可以幫小明打電話。
其他例子:參考自《大話設計模式》
如男A替男B向女A表白。男A就屬於代理,男B屬於被代理。詳細請自行去參考。
注:以上文章僅是個人總結,若有不當之處,望不吝賜教