目錄
代理模式是什麼?
日常中聽到“代理”最多的地方,應該是XX銷售代理。
比如面膜銷售代理
假如銷售面膜這個功能,本來是你擁有的,我當你的銷售代理時,我就也可以進行銷售面膜功能了。
那,我當你的代理,有什麼好處呢?
1. 你的銷路寬了。
我有我的人脈圈,能把面膜賣給我的親朋好友。
2. 你承受風險小了。
面膜出現質量問題時,親朋好友是來我這要說法,他們不認識你,只知道我賣給他們的。
所以說,“代理”其實就是一種,通過另一個人實行你的銷售功能,同時能夠增強你的銷路、降低你風險的一種商業行爲。
也就是說,在編程中,模仿這種商業模式,讓另一個類去實行本類的功能,同時擴展功能、增加安全性的一種模式。
靜態代理模式是什麼
知道代理是啥了,再來簡單聊一下靜態。
靜態,靜態,靜止狀態。就是說,只能代理固定的類,就叫做靜態代理。
靜態代理是代理模式中的一種。代理模式還有:動態代理和Cglib代理,這些我會再其他文章講解。
靜態代理模式小案例
接下來,咱們用代碼把上邊代理銷售面膜來實現一波。
代碼:
賣面膜接口
package 代理模式.靜態代理;
public interface IMaskSeller {
// 買面膜方法
void sellMask();
}
你——被代理者
package 代理模式.靜態代理;
// 你是被代理對象
public class You implements IMaskSeller {
@Override
public void sellMask() {
System.out.println("賣面膜");
}
}
我——代理類
package 代理模式.靜態代理;
// 我代理你
public class Me implements IMaskSeller {
private You you;
public Me(You you) {
this.you=you;
}
@Override
public void sellMask() {
/*
* 相同的方法,增強後,在執行買面膜方法
* 此處可以實現多種增強
* 1. 增加日誌
* 2. 安全驗證
* 3. 數據驗證
* 4. 或者直接飛起以前的方法,此處重寫
* 等
* 等
*/
System.out.println("我是代理,能把面膜賣給自己的盆友");
you.sellMask();
}
}
我的朋友——客戶端
package 代理模式.靜態代理;
// 相當於客戶端
public class MyFriend {
public static void main(String[] args) {
// 此處是個疑問點
You you = new You();
Me me = new Me(you);
me.sellMask();
}
}
UML類圖:
看不懂UML圖的童鞋,可以進我的博客主頁,學習UML類圖。
如上所示:
1. 被代理者,代理者,同時實現統一接口。
2. 代理者調用被代理者的方法。
3. 客戶端,實例化被代理類,傳遞給代理類,調用代理類的方法實現業務。
疑問(希望看到的大佬解答):
靜態代理模式,代理的是一個類,爲什麼不在代理類裏邊直接實例化被代理類,反而要到客戶端去實例化?
學習還是要繼續,繼續帶着疑問學下去,如果以後理解了,會在這裏寫出答案。
當然,我更希望路過的大佬給些指點。
優缺點:
優點:
我已經在代碼的註釋裏邊寫的很清楚了:
可以實現多種增強
* 1. 增加日誌
* 2. 安全驗證
* 3. 數據驗證
* 4. 或者直接飛起以前的方法,此處重寫
* 等
* 等
缺點:
當代理類很多時,接口增加一個方法所有的代理類全部都得實現一遍。!
以上爲個人所學和總結,如果那裏不對,希望看到的大佬指正批評!