背景
代理模式和適配器模式有什么區(qū)別?下面用兩個(gè)示例來(lái)說(shuō)明
適配器模式:假設(shè)你在家里有一個(gè)電源插座,但是你的筆記本電腦的電源線的插頭是美國(guó)標(biāo)準(zhǔn)的,無(wú)法直接插到家里的電源插座中。這時(shí),你可以使用一個(gè)適配器來(lái)解決這個(gè)問(wèn)題。
代理模式:假設(shè)你家里有一個(gè)保姆,你不想讓保姆直接接觸你的貴重物品,但是你需要讓保姆幫你照顧這些物品。這時(shí),你可以使用一個(gè)代理來(lái)解決這個(gè)問(wèn)題。
概述
代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它使得代理對(duì)象可以控制對(duì)實(shí)際對(duì)象的訪問(wèn)。在代理模式中,代理對(duì)象通過(guò)持有對(duì)實(shí)際對(duì)象的引用,來(lái)代替實(shí)際對(duì)象進(jìn)行操作。
代理對(duì)象對(duì)客戶端隱藏了實(shí)際對(duì)象的細(xì)節(jié),并可以在調(diào)用實(shí)際對(duì)象之前或之后執(zhí)行一些額外的操作,如權(quán)限驗(yàn)證、緩存數(shù)據(jù)、對(duì)請(qǐng)求進(jìn)行轉(zhuǎn)發(fā)等。
示例一
以保姆保管貴重物品為例。
定義一個(gè)?Nanny
?接口,表示保姆的行為:
public interface Nanny {
void takeCareOfValuables();
}
創(chuàng)建一個(gè)具體的?NannyImpl
?類來(lái)實(shí)現(xiàn)?Nanny
?接口,表示真正的保姆:
public class NannyImpl implements Nanny {
@Override
public void takeCareOfValuables() {
System.out.println("保姆正在照顧貴重物品");
}
}
創(chuàng)建一個(gè)代理類?NannyProxy
?來(lái)控制對(duì)保姆的訪問(wèn),并在訪問(wèn)時(shí)添加額外的邏輯。例如,我們可以在保姆訪問(wèn)貴重物品之前,先記錄下保姆的行為:
public class NannyProxy implements Nanny {
private Nanny nanny;
public NannyProxy(Nanny nanny) {
this.nanny = nanny;
}
@Override
public void takeCareOfValuables() {
System.out.println("代理保姆正在記錄行為");
nanny.takeCareOfValuables();
}
}
在客戶端代碼中使用代理模式來(lái)控制對(duì)保姆的訪問(wèn):
public class Main {
public static void main(String[] args) {
// 創(chuàng)建真正的保姆對(duì)象
Nanny nanny = new NannyImpl();
// 創(chuàng)建代理保姆對(duì)象
Nanny proxy = new NannyProxy(nanny);
// 通過(guò)代理保姆來(lái)訪問(wèn)貴重物品
proxy.takeCareOfValuables();
}
}
運(yùn)行結(jié)果:
代理保姆正在記錄行為
保姆正在照顧貴重物品
示例二
假設(shè)我們有一個(gè)遠(yuǎn)程文件下載器,負(fù)責(zé)從遠(yuǎn)程服務(wù)器下載文件。為了增強(qiáng)下載器功能,我們可以使用代理模式來(lái)創(chuàng)建一個(gè)下載器的代理。
首先定義一個(gè)遠(yuǎn)程文件下載器的接口:
public interface FileDownloader {
void download(String url);
}
然后實(shí)現(xiàn)實(shí)際的遠(yuǎn)程文件下載器:
public class FileDownloaderImpl implements FileDownloader {
@Override
public void download(String url) {
// 實(shí)際的下載邏輯,省略
System.out.println("Downloading file from " + url);
}
}
接下來(lái)定義一個(gè)文件下載代理:
public class FileDownloaderProxy implements FileDownloader {
private FileDownloaderImpl fileDownloader;
@Override
public void download(String url) {
// 在下載文件之前進(jìn)行一些額外的操作
System.out.println("Before downloading file");
// 延遲加載實(shí)際文件下載器
if (fileDownloader == null) {
fileDownloader = new FileDownloaderImpl();
}
// 調(diào)用實(shí)際文件下載器的方法
fileDownloader.download(url);
// 在下載文件之后進(jìn)行一些額外的操作
System.out.println("After downloading file");
}
}
客戶端代碼可以通過(guò)文件下載代理來(lái)下載文件,而無(wú)需直接訪問(wèn)實(shí)際下載器:
public class Client {
public static void main(String[] args) {
FileDownloader downloader = new FileDownloaderProxy();
downloader.download("https://example.com/file.txt");
}
}
運(yùn)行結(jié)果:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-612917.html
Before downloading file
Downloading file from https://example.com/file.txt
After downloading file?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-612917.html
到了這里,關(guān)于結(jié)構(gòu)型-代理模式(Proxy Pattern)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!