Java設(shè)計(jì)模式中代理模式應(yīng)用詳解
編程是一門藝術(shù),大批量的改動(dòng)顯然是非常丑陋的做法,用心的琢磨寫的代碼讓它變的更美觀。
在有些情況下,一個(gè)客戶不能或者不想直接訪問另一個(gè)對(duì)象,這時(shí)需要找一個(gè)中介幫忙完成某項(xiàng)任務(wù),這個(gè)中介就是代理對(duì)象。找女朋友、找保姆、找工作等都可以通過找中介完成。
在軟件設(shè)計(jì)中,使用代理模式的例子也很多,例如,要訪問的遠(yuǎn)程對(duì)象比較大(如視頻或大圖像等),其下載要花很多時(shí)間。還有因?yàn)榘踩蛐枰帘慰蛻舳酥苯釉L問真實(shí)對(duì)象,如某單位的內(nèi)部數(shù)據(jù)庫等。
1.代理設(shè)計(jì)模式定義
代理模式:由于某些原因需要給某對(duì)象提供一個(gè)代理以控制對(duì)該對(duì)象的訪問。這時(shí),訪問對(duì)象不適合或者不能直接引用目標(biāo)對(duì)象,代理對(duì)象作為訪問對(duì)象和目標(biāo)對(duì)象之間的中介。
2.代理設(shè)計(jì)模式的優(yōu)點(diǎn)與不足
代理模式的主要優(yōu)點(diǎn)有:
- 代理模式在客戶端與目標(biāo)對(duì)象之間起到一個(gè)中介作用和保護(hù)目標(biāo)對(duì)象的作用;
- 代理對(duì)象可以擴(kuò)展目標(biāo)對(duì)象的功能;
- 代理模式能將客戶端與目標(biāo)對(duì)象分離,在一定程度上降低了系統(tǒng)的耦合度,增加了程序的可擴(kuò)展性
其主要缺點(diǎn)是:
- 代理模式會(huì)造成系統(tǒng)設(shè)計(jì)中類的數(shù)量增加
- 在客戶端和目標(biāo)對(duì)象之間增加一個(gè)代理對(duì)象,會(huì)造成請(qǐng)求處理速度變慢;
- 增加了系統(tǒng)的復(fù)雜度;
也可以考慮使用動(dòng)態(tài)代理
3.代理設(shè)計(jì)模式的實(shí)現(xiàn)思路
代理模式的結(jié)構(gòu)比較簡單,主要是通過定義一個(gè)繼承抽象主題的代理來包含真實(shí)主題,從而實(shí)現(xiàn)對(duì)真實(shí)主題的訪問,下面來分析其基本結(jié)構(gòu)和實(shí)現(xiàn)方法。
代理模式的主要角色如下:
- 抽象主題(Subject)類:通過接口或抽象類聲明真實(shí)主題和代理對(duì)象實(shí)現(xiàn)的業(yè)務(wù)方法。
- 真實(shí)主題(Real Subject)類:實(shí)現(xiàn)了抽象主題中的具體業(yè)務(wù),是代理對(duì)象所代表的真實(shí)對(duì)象,是最終要引用的對(duì)象。
- 代理(Proxy)類:提供了與真實(shí)主題相同的接口,其內(nèi)部含有對(duì)真實(shí)主題的引用,它可以訪問、控制或擴(kuò)展真實(shí)主題的功能。
4.代理設(shè)計(jì)模式代碼示例
示例場(chǎng)景介紹:在拍攝預(yù)覽的時(shí)候,可以渲染各種特效,比如:磨皮,美白,濾鏡等,但是假如不能直接渲染美妝特效,那么美妝特效就可以使用代理的方式添加。
public interface IEffect {
String renderEffect();
}
public class EffectImpl implements IEffect {
@Override
public String renderEffect() {
System.out.println("渲染美白特效成功");
return "美白";
}
}
public class MakeUpEffectImpl implements IEffect {
@Override
public String renderEffect() {
System.out.println("渲染美妝成功");
return "美妝";
}
}
public class ProxyOrder implements IEffect {
/**
* 代理類持有被代理的對(duì)象 ,進(jìn)行操作的時(shí)候,執(zhí)行的是持有的代理類的相應(yīng)邏輯
*/
private IEffect orderService = new MakeUpEffectImpl();
@Override
public String renderEffect() {
System.out.println("開始渲染美妝");
orderService.renderEffect();
System.out.println("渲染美妝結(jié)束");
return "增加了美妝特效";
}
}
public static void main(String[] args) {
IEffect orderService = new ProxyOrder();
orderService.renderEffect();
}通過代理類,進(jìn)行了美妝的渲染操作,并且進(jìn)行打印,可以認(rèn)為對(duì)功能進(jìn)行了增強(qiáng)。
5.代理設(shè)計(jì)模式的應(yīng)用場(chǎng)景
當(dāng)無法或不想直接引用某個(gè)對(duì)象或訪問某個(gè)對(duì)象存在困難時(shí),可以通過代理對(duì)象來間接訪問。使用代理模式主要有兩個(gè)目的:一是保護(hù)目標(biāo)對(duì)象,二是增強(qiáng)目標(biāo)對(duì)象。
- 遠(yuǎn)程代理,這種方式通常是為了隱藏目標(biāo)對(duì)象存在于不同地址空間的事實(shí),方便客戶端訪問。例如,用戶申請(qǐng)某些網(wǎng)盤空間時(shí),會(huì)在用戶的文件系統(tǒng)中建立一個(gè)虛擬的硬盤,用戶訪問虛擬硬盤時(shí)實(shí)際訪問的是網(wǎng)盤空間。
- 虛擬代理,這種方式通常用于要?jiǎng)?chuàng)建的目標(biāo)對(duì)象開銷很大時(shí)。例如,下載一幅很大的圖像需要很長時(shí)間,因某種計(jì)算比較復(fù)雜而短時(shí)間無法完成,這時(shí)可以先用小比例的虛擬代理替換真實(shí)的對(duì)象,消除用戶對(duì)服務(wù)器慢的感覺。
- 安全代理,這種方式通常用于控制不同種類客戶對(duì)真實(shí)對(duì)象的訪問權(quán)限。
- 智能指引,主要用于調(diào)用目標(biāo)對(duì)象時(shí),代理附加一些額外的處理功能。例如,增加計(jì)算真實(shí)對(duì)象的引用次數(shù)的功能,這樣當(dāng)該對(duì)象沒有被引用時(shí),就可以自動(dòng)釋放它。
- 延遲加載,指為了提高系統(tǒng)的性能,延遲對(duì)目標(biāo)的加載。例如,Hibernate中就存在屬性的延遲加載和關(guān)聯(lián)表的延時(shí)加載。
到此這篇關(guān)于Java設(shè)計(jì)模式中代理模式應(yīng)用詳解的文章就介紹到這了,更多相關(guān)Java代理模式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解SimpleDateFormat的線程安全問題與解決方案
這篇文章主要介紹了SimpleDateFormat的線程安全問題與解決方案,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03
java中json和對(duì)象之間相互轉(zhuǎn)換的運(yùn)用
本文主要介紹了java中json和對(duì)象之間相互轉(zhuǎn)換的運(yùn)用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
spring應(yīng)用中多次讀取http post方法中的流遇到的問題
這篇文章主要介紹了spring應(yīng)用中多次讀取http post方法中的流,文中給大家列舉處理問題描述及解決方法,需要的朋友可以參考下2018-11-11
java面向?qū)ο笤O(shè)計(jì)原則之接口隔離原則示例詳解
這篇文章主要為大家介紹了java面向?qū)ο笤O(shè)計(jì)原則之接口隔離原則的示例詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-10-10
Spring JDK動(dòng)態(tài)代理實(shí)現(xiàn)過程詳解
這篇文章主要介紹了Spring JDK動(dòng)態(tài)代理實(shí)現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
spring security4 添加驗(yàn)證碼的示例代碼
本篇文章主要介紹了spring security4 添加驗(yàn)證碼的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02
通過實(shí)例講解springboot整合WebSocket
這篇文章主要介紹了通過實(shí)例講解springboot整合WebSocket,WebSocket為游覽器和服務(wù)器提供了雙工異步通信的功能,即游覽器可以向服務(wù)器發(fā)送消息,服務(wù)器也可以向游覽器發(fā)送消息。,需要的朋友可以參考下2019-06-06

