05.靜態(tài)代理設(shè)計(jì)模式
目錄介紹
- 01.靜態(tài)代理模式基礎(chǔ)
- 1.1 靜態(tài)代理由來(lái)
- 1.2 靜態(tài)代理定義
- 1.3 靜態(tài)代理場(chǎng)景
- 1.4 靜態(tài)代理思考
- 02.靜態(tài)代理原理與實(shí)現(xiàn)
- 2.1 羅列一個(gè)場(chǎng)景
- 2.2 用一個(gè)例子理解代理
- 2.3 案例演變分析
- 03.靜態(tài)代理分析
- 3.1 靜態(tài)代理結(jié)構(gòu)圖
- 3.2 靜態(tài)代理時(shí)序圖
- 04.代理模式優(yōu)勢(shì)
- 4.1 如何降低耦合
- 4.2 保護(hù)真實(shí)對(duì)象使用權(quán)限
- 05.靜態(tài)代理不足
- 5.1 靜態(tài)代理類優(yōu)缺點(diǎn)
- 5.2 靜態(tài)代理缺乏靈活
- 5.3 靜態(tài)代理復(fù)用難
- 5.4 難以動(dòng)態(tài)添加功能
- 5.5 無(wú)法實(shí)現(xiàn)多態(tài)
- 5.6 思考一下局限性
- 5.7 動(dòng)態(tài)代理彌補(bǔ)不足
- 06.靜態(tài)代理總結(jié)
- 6.1 總結(jié)一下學(xué)習(xí)
- 6.2 更多內(nèi)容推薦
推薦一個(gè)好玩網(wǎng)站
一個(gè)最純粹的技術(shù)分享網(wǎng)站,打造精品技術(shù)編程專欄秸妥!編程進(jìn)階網(wǎng)
01.靜態(tài)代理模式基礎(chǔ)
1.1 靜態(tài)代理由來(lái)
在某些情況下,一個(gè)客戶不想或者不能直接引用一個(gè)對(duì)象,此時(shí)可以通過(guò)一個(gè)稱之為“代理”的第三者來(lái)實(shí)現(xiàn)間接引用豁状。
代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用诗力,并且可以通過(guò)代理對(duì)象去掉客戶不能看到的內(nèi)容和服務(wù)或者添加客戶需要的額外服務(wù)辜梳。
代理模式的英 文叫做Proxy或Surrogate,它是一種對(duì)象結(jié)構(gòu)型模式搂漠。
1.2 靜態(tài)代理定義
靜態(tài)代理定義是什么?
代理模式(Proxy Pattern) :為了隱藏與保護(hù)目標(biāo)對(duì)象某弦,給某一個(gè)對(duì)象提供一個(gè)代理桐汤,并由代理對(duì)象控制對(duì)原對(duì)象的引用而克。
1.3 靜態(tài)代理場(chǎng)景
靜態(tài)代理使用場(chǎng)景
代理模式常用在業(yè)務(wù)系統(tǒng)中開(kāi)發(fā)一些非功能性需求,比如:監(jiān)控怔毛、統(tǒng)計(jì)拍摇、鑒權(quán)、限流馆截、事務(wù)充活、冪等、日志蜡娶。
我們將這些附加功能與業(yè)務(wù)功能解耦混卵,放到代理類統(tǒng)一處理,讓程序員只需要關(guān)注業(yè)務(wù)方面的開(kāi)發(fā)窖张。除此之外幕随,代理模式還可以用在 RPC、緩存等應(yīng)用場(chǎng)景中宿接。
1.4 靜態(tài)代理思考
思考一下:代理類和被代理類的關(guān)系赘淮?
靜態(tài)代理中,代理類和被代理類之間的關(guān)系在編譯時(shí)就已經(jīng)確定睦霎。需要考慮代理類和被代理類之間的接口或繼承關(guān)系梢卸,以確保代理類能夠正確地代理被代理類的功能。
思考一下:代理類的責(zé)任副女?
代理類在靜態(tài)代理中充當(dāng)了中介的角色蛤高,負(fù)責(zé)將客戶端的請(qǐng)求轉(zhuǎn)發(fā)給被代理類,并在必要時(shí)添加額外的功能或控制碑幅。需要考慮代理類應(yīng)該承擔(dān)的責(zé)任戴陡,以及如何在代理類中實(shí)現(xiàn)這些責(zé)任。
思考一下:代理類的性能和效率沟涨?
靜態(tài)代理在編譯時(shí)就已經(jīng)確定代理類和被代理類的關(guān)系恤批,因此在運(yùn)行時(shí)不需要進(jìn)行額外的動(dòng)態(tài)代理操作。這可能會(huì)帶來(lái)一些性能和效率上的優(yōu)勢(shì)裹赴,但也需要考慮代理類的創(chuàng)建和銷毀成本喜庞,以及代理類對(duì)系統(tǒng)性能的影響。
思考一下:代理類的擴(kuò)展性和維護(hù)性篮昧?
靜態(tài)代理在編譯時(shí)就已經(jīng)確定代理類和被代理類的關(guān)系赋荆,因此在需要代理多個(gè)類或接口時(shí),就需要編寫多個(gè)代理類懊昨。這可能會(huì)導(dǎo)致代碼冗余和維護(hù)困難窄潭。需要考慮如何設(shè)計(jì)代理類,以提高代碼的擴(kuò)展性和維護(hù)性。
02.靜態(tài)代理原理與實(shí)現(xiàn)
2.1 羅列一個(gè)場(chǎng)景
第一個(gè)類比:代理對(duì)象是中介嫉你,原對(duì)象是房東的房子月帝,客戶就是我們需要找房的人。
房東的房子讓中介代理出租幽污,中介可以直接控制房子出租嚷辅,用戶是不能找房東直接租房子的,而是要間接通過(guò)中介租房子距误。
第二個(gè)類比:代理對(duì)象是售票點(diǎn)簸搞,原對(duì)象是火車站,客戶就是需要買票的乘客准潭。
我們購(gòu)買火車票可以去火車站買趁俊,但是也可以去火車票代售處買,此處的火車票代售處就是火車站購(gòu)票的代理刑然,即我們?cè)诖埸c(diǎn)發(fā)出買票請(qǐng)求寺擂,代售點(diǎn)會(huì)把請(qǐng)求發(fā)給火車站,火車站把購(gòu)買成功響應(yīng)發(fā)給代售點(diǎn)泼掠,代售點(diǎn)再告訴你怔软。
但是代售點(diǎn)只能買票,不能退票择镇,而火車站能買票也能退票挡逼,因此代理對(duì)象支持的操作可能和委托對(duì)象的操作有所不同。
第三個(gè)類比:代理對(duì)象是vpn沐鼠,原對(duì)象是國(guó)外網(wǎng)站挚瘟,客戶就是需要翻墻上網(wǎng)的人叹谁。
(1)用戶把HTTP請(qǐng)求發(fā)給代理饲梭;(2)代理把HTTP請(qǐng)求發(fā)給web服務(wù)器;(3)web服務(wù)器把HTTP響應(yīng)發(fā)給代理焰檩;(4)代理把HTTP響應(yīng)發(fā)回給用戶
2.2 用一個(gè)例子理解代理
實(shí)現(xiàn)模式
- 首先創(chuàng)建一個(gè)接口(代理都是面向接口的)憔涉,
- 創(chuàng)建具體實(shí)現(xiàn)類來(lái)實(shí)現(xiàn)這個(gè)接口,
- 創(chuàng)建一個(gè)代理類同樣實(shí)現(xiàn)這個(gè)接口析苫,不同之處在于具體實(shí)現(xiàn)類的方法中需要將接口中定義的方法的業(yè)務(wù)邏輯功能實(shí)現(xiàn)兜叨,而代理類中的方法只要調(diào)用具體類中的對(duì)應(yīng)方法即可,這樣我們?cè)谛枰褂媒涌谥械哪硞€(gè)方法的功能時(shí)直接調(diào)用代理類的方法即可衩侥,將具體的實(shí)現(xiàn)類隱藏在底層国旷。
舉一個(gè)實(shí)際案例
- 定義用戶找房子的需求接口
- 創(chuàng)建用戶找房子具體實(shí)現(xiàn)類
- 創(chuàng)建一個(gè)代理中介,委托中介去找房子
代碼如下所示茫死,可以了解到跪但,靜態(tài)代理可以通過(guò)聚合來(lái)實(shí)現(xiàn),讓代理類持有一個(gè)委托類的引用即可峦萎。代碼案例放到GitHub上屡久,設(shè)計(jì)模式代碼案例
/**
* 靜態(tài)代理偽代碼
*/
private void testProxy() {
//1.創(chuàng)建委托對(duì)象
RealSubject subject = new RealSubject();
//2.創(chuàng)建調(diào)用處理器對(duì)象
MyProxy p = new MyProxy(subject);
//3.通過(guò)代理對(duì)象調(diào)用方法
p.request();
}
/**
* 代理類和委托類會(huì)實(shí)現(xiàn)接口
*/
interface Subject{
void request();
}
/**
* 委托類
*/
class RealSubject implements Subject{
@Override
public void request(){
System.out.println("request");
}
}
/**
* 代理
*/
class Proxy implements Subject{
private Subject subject;
public Proxy(Subject subject){
this.subject = subject;
}
@Override
public void request(){
System.out.println("PreProcess");
subject.request();
System.out.println("PostProcess");
}
}
2.3 案例演變分析
考慮一下這個(gè)需求:
給委托類增加一個(gè)過(guò)濾功能忆首,只租房給我們這類逗比程序員。通過(guò)靜態(tài)代理被环,我們無(wú)需修改委托類的代碼就可以實(shí)現(xiàn)糙及,只需在代理類中的方法中添加一個(gè)判斷即可如下所示:
class MyProxy implements Subject {
private Subject subject;
public MyProxy(Subject subject){
this.subject = subject;
}
@Override
public void request(){
//判斷是否是逗比程序員
if (isDouBi){
System.out.println("PreProcess");
subject.request();
System.out.println("PostProcess");
}
}
}
使用代理的第二個(gè)優(yōu)點(diǎn):
可以實(shí)現(xiàn)客戶與委托類間的解耦,在不修改委托類代碼的情況下能夠做一些額外的處理筛欢。靜態(tài)代理的局限在于運(yùn)行前必須編寫好代理類浸锨。
03.靜態(tài)代理分析
3.1 靜態(tài)代理結(jié)構(gòu)圖
代理模式包含如下角色:
- Subject: 抽象主題角色
- Proxy: 代理主題角色
- RealSubject: 真實(shí)主題角色
靜態(tài)代理結(jié)構(gòu)圖
[圖片上傳失敗...(image-60c2ea-1729781510969)]
3.2 靜態(tài)代理時(shí)序圖
靜態(tài)代理時(shí)序圖如下所示
[圖片上傳失敗...(image-9a8424-1729781510969)]
04.代理模式優(yōu)勢(shì)
4.1 如何降低耦合
一個(gè)簡(jiǎn)單的案例,演示了如何使用靜態(tài)代理來(lái)降低耦合:
假設(shè)我們有一個(gè)郵件發(fā)送的接口 MailSender版姑,以及一個(gè)實(shí)現(xiàn)該接口的具體類 RealMailSender揣钦。
現(xiàn)在我們想要在發(fā)送郵件之前記錄日志,但又不想直接修改 RealMailSender 類漠酿。這時(shí)可以使用靜態(tài)代理來(lái)實(shí)現(xiàn):
// 定義郵件發(fā)送接口
interface MailSender {
void sendMail(String recipient, String message);
}
// 實(shí)現(xiàn)郵件發(fā)送接口的具體類
class RealMailSender implements MailSender {
public void sendMail(String recipient, String message) {
System.out.println("Sending mail to " + recipient + ": " + message);
}
}
// 靜態(tài)代理類
class MailSenderProxy implements MailSender {
private RealMailSender realMailSender;
public MailSenderProxy() {
this.realMailSender = new RealMailSender();
}
public void sendMail(String recipient, String message) {
System.out.println("Logging mail sending...");
realMailSender.sendMail(recipient, message);
}
}
// 使用示例
public class Main {
public static void main(String[] args) {
MailSender mailSender = new MailSenderProxy();
mailSender.sendMail("example@example.com", "Hello, world!");
}
}
代碼案例分析冯凹,它降低耦合的設(shè)計(jì)思想是什么
通過(guò)使用靜態(tài)代理,我們可以在不修改 RealMailSender 類的情況下炒嘲,為郵件發(fā)送操作添加額外的功能宇姚。這樣,RealMailSender 類和 MailSenderProxy 類之間的耦合度降低夫凸,客戶端只需要與 MailSender 接口進(jìn)行交互浑劳,而不需要關(guān)心具體的實(shí)現(xiàn)類。
靜態(tài)代理可以通過(guò)以下方式降低耦合:
- 接口抽象:定義一個(gè)接口夭拌,代理類和被代理類都實(shí)現(xiàn)該接口魔熏。通過(guò)接口的抽象,代理類和被代理類之間的耦合度降低鸽扁,客戶端只需要與接口進(jìn)行交互蒜绽,而不需要關(guān)心具體的實(shí)現(xiàn)類。
- 代理類作為中介:代理類作為客戶端和被代理類之間的中介桶现,將客戶端的請(qǐng)求轉(zhuǎn)發(fā)給被代理類躲雅。這樣,客戶端只需要與代理類進(jìn)行交互骡和,而不需要直接與被代理類進(jìn)行交互相赁,從而降低了客戶端與被代理類之間的耦合。
- 面向接口編程:在客戶端代碼中慰于,盡量使用接口類型來(lái)聲明變量钮科,而不是具體的實(shí)現(xiàn)類。這樣可以使客戶端與具體的代理類解耦婆赠,提高代碼的靈活性和可擴(kuò)展性绵脯。
- 使用依賴注入:通過(guò)依賴注入的方式,將代理對(duì)象注入到客戶端中,而不是在客戶端代碼中直接創(chuàng)建代理對(duì)象桨嫁。這樣可以將代理對(duì)象的創(chuàng)建和配置與客戶端代碼解耦植兰,提高代碼的可維護(hù)性和可測(cè)試性。
4.2 保護(hù)真實(shí)對(duì)象使用權(quán)限
靜態(tài)代理可以用于保護(hù)真實(shí)對(duì)象的使用權(quán)限璃吧。
通過(guò)代理類楣导,可以在訪問(wèn)真實(shí)對(duì)象之前或之后執(zhí)行一些額外的操作,例如權(quán)限驗(yàn)證畜挨、身份驗(yàn)證等筒繁,以確保只有具有適當(dāng)權(quán)限的用戶可以訪問(wèn)真實(shí)對(duì)象。
以下是一個(gè)簡(jiǎn)單的示例巴元,演示了如何使用靜態(tài)代理來(lái)保護(hù)真實(shí)對(duì)象的使用權(quán)限:
- Image接口定義了display方法毡咏,RealImage類實(shí)現(xiàn)了該接口并表示真實(shí)對(duì)象。ImageProxy類也實(shí)現(xiàn)了Image接口逮刨,并在display方法中創(chuàng)建或使用真實(shí)對(duì)象呕缭。
- 通過(guò)ImageProxy類,我們可以在訪問(wèn)真實(shí)對(duì)象之前進(jìn)行權(quán)限驗(yàn)證或其他操作修己。只有在真正需要顯示圖像時(shí)恢总,真實(shí)對(duì)象才會(huì)被加載和顯示,從而保護(hù)了真實(shí)對(duì)象的使用權(quán)限睬愤。
private static void proxyImage() {
Image image = new ImageProxy("image.jpg");
// 只有在調(diào)用display方法時(shí)片仿,真實(shí)對(duì)象才會(huì)被加載和顯示
image.display();
}
// 定義接口
interface Image {
void display();
}
// 定義真實(shí)對(duì)象
static class RealImage implements Image {
private String filename;
public RealImage(String filename) {
this.filename = filename;
loadFromDisk();
}
private void loadFromDisk() {
System.out.println("Loading image from disk: " + filename);
}
public void display() {
System.out.println("Displaying image: " + filename);
}
}
// 定義代理類
static class ImageProxy implements Image {
private String filename;
private RealImage realImage;
public ImageProxy(String filename) {
this.filename = filename;
}
public void display() {
if (realImage == null) {
realImage = new RealImage(filename);
}
realImage.display();
}
}
05.靜態(tài)代理不足
5.1 靜態(tài)代理類優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
業(yè)務(wù)類只需要關(guān)注業(yè)務(wù)邏輯本身,保證了業(yè)務(wù)類的重用性尤辱。這是代理的共有優(yōu)點(diǎn)砂豌。
缺點(diǎn):
- 1)代理對(duì)象的一個(gè)接口只服務(wù)于一種類型的對(duì)象,如果要代理的方法很多光督,勢(shì)必要為每一種方法都進(jìn)行代理阳距,靜態(tài)代理在程序規(guī)模稍大時(shí)就無(wú)法勝任了。
- 2)如果接口增加一個(gè)方法可帽,除了所有實(shí)現(xiàn)類需要實(shí)現(xiàn)這個(gè)方法外娄涩,所有代理類也需要實(shí)現(xiàn)此方法。增加了代碼維護(hù)的復(fù)雜度映跟。
5.2 靜態(tài)代理缺乏靈活
靜態(tài)代理缺乏靈活說(shuō)明:
靜態(tài)代理在編譯時(shí)就已經(jīng)確定代理類和被代理類的關(guān)系,因此無(wú)法在運(yùn)行時(shí)動(dòng)態(tài)地改變代理行為扬虚。而動(dòng)態(tài)代理允許在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建代理對(duì)象努隙,并可以根據(jù)需要?jiǎng)討B(tài)地改變代理行為,提供更大的靈活性辜昵。
5.3 靜態(tài)代理復(fù)用難
代碼復(fù)用難荸镊,會(huì)導(dǎo)致代碼龐大:
靜態(tài)代理需要為每個(gè)被代理類編寫一個(gè)代理類,當(dāng)需要代理多個(gè)類時(shí),會(huì)導(dǎo)致代碼冗余躬存。而動(dòng)態(tài)代理可以通過(guò)一個(gè)通用的代理類來(lái)代理多個(gè)類张惹,實(shí)現(xiàn)代碼的復(fù)用。
5.4 難以動(dòng)態(tài)添加功能
靜態(tài)代理動(dòng)態(tài)添加功能:
靜態(tài)代理在編譯時(shí)就已經(jīng)確定代理類和被代理類的關(guān)系岭洲,無(wú)法在運(yùn)行時(shí)動(dòng)態(tài)地添加額外的功能宛逗。而動(dòng)態(tài)代理可以在運(yùn)行時(shí)動(dòng)態(tài)地為被代理對(duì)象添加額外的功能,例如日志記錄盾剩、性能監(jiān)控藻茂、事務(wù)管理等惕鼓。
5.5 無(wú)法實(shí)現(xiàn)多態(tài)
靜態(tài)代理無(wú)法滿足多態(tài)性:
靜態(tài)代理在編譯時(shí)就已經(jīng)確定代理類和被代理類的關(guān)系,無(wú)法實(shí)現(xiàn)多態(tài)性。而動(dòng)態(tài)代理可以基于接口或基類來(lái)創(chuàng)建代理對(duì)象叶雹,實(shí)現(xiàn)多態(tài)性,使得代理對(duì)象可以替代被代理對(duì)象的使用友扰。
5.6 思考一下局限性
如果要按照上述的方法使用代理模式批糟,那么真實(shí)角色(委托類)必須是事先已經(jīng)存在的,并將其作為代理對(duì)象的內(nèi)部屬性蜀撑。
但是實(shí)際使用時(shí)番挺,一個(gè)真實(shí)角色必須對(duì)應(yīng)一個(gè)代理角色,如果大量使用會(huì)導(dǎo)致類的急劇膨脹屯掖;此外玄柏,如果事先并不知道真實(shí)角色(委托類),該如何使用代理呢贴铜?這個(gè)問(wèn)題可以通過(guò)Java的動(dòng)態(tài)代理類來(lái)解決粪摘。
5.7 動(dòng)態(tài)代理彌補(bǔ)不足
- 代碼復(fù)用:動(dòng)態(tài)代理可以通過(guò)一個(gè)通用的代理類來(lái)代理多個(gè)類,實(shí)現(xiàn)代碼的復(fù)用绍坝。不需要為每個(gè)被代理類編寫一個(gè)代理類徘意,減少了代碼的冗余。
- 靈活性和擴(kuò)展性:動(dòng)態(tài)代理在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建代理對(duì)象轩褐,并可以根據(jù)需要?jiǎng)討B(tài)地添加椎咧、修改或刪除代理行為。這使得代理行為可以根據(jù)不同的需求進(jìn)行定制和擴(kuò)展把介,提供了更大的靈活性和擴(kuò)展性勤讽。
- 解耦合:動(dòng)態(tài)代理通過(guò)使用接口或基類來(lái)代理對(duì)象,實(shí)現(xiàn)了代理類和被代理類之間的松耦合拗踢〗烹梗客戶端只需要與代理對(duì)象進(jìn)行交互,無(wú)需關(guān)心具體的實(shí)現(xiàn)類巢墅,提高了代碼的可維護(hù)性和可擴(kuò)展性诸狭。
總結(jié)起來(lái)券膀,靜態(tài)代理在一些簡(jiǎn)單的場(chǎng)景下可以使用,但在需要更大的靈活性驯遇、擴(kuò)展性和可維護(hù)性時(shí)芹彬,動(dòng)態(tài)代理更為適合。
06.靜態(tài)代理總結(jié)
6.1 總結(jié)一下學(xué)習(xí)
01.靜態(tài)代理模式基礎(chǔ)
由來(lái)和背景:在某些情況下叉庐,一個(gè)客戶不想或者不能直接引用一個(gè)對(duì)象舒帮,此時(shí)可以通過(guò)一個(gè)稱之為“代理”的第三者來(lái)實(shí)現(xiàn)間接引用。比如以下場(chǎng)景就適合用代理模式
- 個(gè)人眨唬,通過(guò)中介來(lái)找房東發(fā)布的租房会前。
- 乘客,通過(guò)火車站來(lái)購(gòu)買鐵路局的車票匾竿。
- 客戶瓦宜,通過(guò)VPN代理來(lái)翻墻查閱國(guó)外資料。
一句話概括就是:代理模式(Proxy Pattern) :給某一個(gè)對(duì)象提供一個(gè)代理岭妖,并由代理對(duì)象控制對(duì)原對(duì)象的引用临庇。
靜態(tài)代理使用場(chǎng)景:監(jiān)控、統(tǒng)計(jì)昵慌、鑒權(quán)假夺,日志等場(chǎng)景。附加功能與業(yè)務(wù)功能解耦斋攀,放到代理類統(tǒng)一處理已卷,讓程序員只需要關(guān)注業(yè)務(wù)方面的開(kāi)發(fā)!
02.靜態(tài)代理原理與實(shí)現(xiàn)
實(shí)現(xiàn)模式
- 首先創(chuàng)建一個(gè)接口(代理都是面向接口的)淳蔼,
- 創(chuàng)建具體實(shí)現(xiàn)類來(lái)實(shí)現(xiàn)這個(gè)接口侧蘸,
- 創(chuàng)建一個(gè)代理類同樣實(shí)現(xiàn)這個(gè)接口,不同之處在于具體實(shí)現(xiàn)類的方法中需要將接口中定義的方法的業(yè)務(wù)邏輯功能實(shí)現(xiàn)鹉梨,而代理類中的方法只要調(diào)用具體類中的對(duì)應(yīng)方法即可讳癌,這樣我們?cè)谛枰褂媒涌谥械哪硞€(gè)方法的功能時(shí)直接調(diào)用代理類的方法即可,將具體的實(shí)現(xiàn)類隱藏在底層存皂。
舉一個(gè)實(shí)際案例
- 定義用戶找房子的需求接口
- 創(chuàng)建用戶找房子具體實(shí)現(xiàn)類
- 創(chuàng)建一個(gè)代理中介晌坤,委托中介去找房子
03.靜態(tài)代理分析
代理模式包含如下角色:
- Subject: 抽象主題角色
- Proxy: 代理主題角色
- RealSubject: 真實(shí)主題角色
04.代理模式優(yōu)勢(shì)
- 使用靜態(tài)代理來(lái)降低耦合。比如旦袋,郵件發(fā)送的接口 MailSender骤菠,以及一個(gè)實(shí)現(xiàn)該接口的具體類 RealMailSender〔略鳎可以在不修改 RealMailSender 類的情況下娩怎,為郵件發(fā)送操作添加額外的功能。這樣胰柑,RealMailSender 類和 MailSenderProxy 類之間的耦合度降低截亦,客戶端只需要與 MailSender 接口進(jìn)行交互,而不需要關(guān)心具體的實(shí)現(xiàn)類柬讨。
- 靜態(tài)代理可以用于保護(hù)真實(shí)對(duì)象的使用權(quán)限崩瓤。在真正需要顯示圖像時(shí),真實(shí)對(duì)象才會(huì)被加載和顯示踩官,從而保護(hù)了真實(shí)對(duì)象的使用權(quán)限却桶。
05.靜態(tài)代理不足
- 靜態(tài)代理缺乏靈活說(shuō)明
- 代碼復(fù)用難,會(huì)導(dǎo)致代碼龐大
- 難以動(dòng)態(tài)添加功能
- 靜態(tài)代理無(wú)法滿足多態(tài)性
6.2 更多內(nèi)容推薦
模塊 | 描述 | 備注 |
---|---|---|
GitHub | 多個(gè)YC系列開(kāi)源項(xiàng)目蔗牡,包含Android組件庫(kù)颖系,以及多個(gè)案例 | GitHub |
博客匯總 | 匯聚Java,Android辩越,C/C++嘁扼,網(wǎng)絡(luò)協(xié)議,算法黔攒,編程總結(jié)等 | YCBlogs |
設(shè)計(jì)模式 | 六大設(shè)計(jì)原則趁啸,23種設(shè)計(jì)模式,設(shè)計(jì)模式案例督惰,面向?qū)ο笏枷?/td> | 設(shè)計(jì)模式 |
Java進(jìn)階 | 數(shù)據(jù)設(shè)計(jì)和原理不傅,面向?qū)ο蠛诵乃枷耄琁O赏胚,異常访娶,線程和并發(fā),JVM | Java高級(jí) |
網(wǎng)絡(luò)協(xié)議 | 網(wǎng)絡(luò)實(shí)際案例觉阅,網(wǎng)絡(luò)原理和分層崖疤,Https,網(wǎng)絡(luò)請(qǐng)求留拾,故障排查 | 網(wǎng)絡(luò)協(xié)議 |
計(jì)算機(jī)原理 | 計(jì)算機(jī)組成結(jié)構(gòu)戳晌,框架,存儲(chǔ)器痴柔,CPU設(shè)計(jì)沦偎,內(nèi)存設(shè)計(jì),指令編程原理咳蔚,異常處理機(jī)制豪嚎,IO操作和原理 | 計(jì)算機(jī)基礎(chǔ) |
學(xué)習(xí)C編程 | C語(yǔ)言入門級(jí)別系統(tǒng)全面的學(xué)習(xí)教程,學(xué)習(xí)三到四個(gè)綜合案例 | C編程 |
C++編程 | C++語(yǔ)言入門級(jí)別系統(tǒng)全面的教學(xué)教程谈火,并發(fā)編程侈询,核心原理 | C++編程 |
算法實(shí)踐 | 專欄,數(shù)組糯耍,鏈表扔字,棧囊嘉,隊(duì)列,樹(shù)革为,哈希扭粱,遞歸,查找震檩,排序等 | Leetcode |
Android | 基礎(chǔ)入門琢蛤,開(kāi)源庫(kù)解讀,性能優(yōu)化抛虏,F(xiàn)ramework博其,方案設(shè)計(jì) | Android |
23種設(shè)計(jì)模式
23種設(shè)計(jì)模式 & 描述 & 核心作用 | 包括 |
---|---|
創(chuàng)建型模式 提供創(chuàng)建對(duì)象用例。能夠?qū)④浖K中對(duì)象的創(chuàng)建和對(duì)象的使用分離 |
工廠模式(Factory Pattern) 抽象工廠模式(Abstract Factory Pattern) 單例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern) |
結(jié)構(gòu)型模式 關(guān)注類和對(duì)象的組合迂猴。描述如何將類或者對(duì)象結(jié)合在一起形成更大的結(jié)構(gòu) |
適配器模式(Adapter Pattern) 橋接模式(Bridge Pattern) 過(guò)濾器模式(Filter慕淡、Criteria Pattern) 組合模式(Composite Pattern) 裝飾器模式(Decorator Pattern) 外觀模式(Facade Pattern) 享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) |
行為型模式 特別關(guān)注對(duì)象之間的通信。主要解決的就是“類或?qū)ο笾g的交互”問(wèn)題 |
責(zé)任鏈模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解釋器模式(Interpreter Pattern) 迭代器模式(Iterator Pattern) 中介者模式(Mediator Pattern) 備忘錄模式(Memento Pattern) 觀察者模式(Observer Pattern) 狀態(tài)模式(State Pattern) 空對(duì)象模式(Null Object Pattern) 策略模式(Strategy Pattern) 模板模式(Template Pattern) 訪問(wèn)者模式(Visitor Pattern) |
6.3 更多內(nèi)容
- GitHub:https://github.com/yangchong211
- 我的編程網(wǎng)站:https://yccoding.com
- 博客匯總:https://github.com/yangchong211/YCBlogs
- 設(shè)計(jì)模式專欄:https://github.com/yangchong211/YCDesignBlog
- Java高級(jí)進(jìn)階專欄:https://github.com/yangchong211/YCJavaBlog
- 網(wǎng)絡(luò)協(xié)議專欄:https://github.com/yangchong211/YCNetwork
- 計(jì)算機(jī)基礎(chǔ)原理專欄:https://github.com/yangchong211/YCComputerBlog