设计模式(三) | 为别人做嫁衣---代理模式
?
?
代理模式
?
?
?
代理模式:為其他對象提供一種代理,以控制對這個對象的訪問。
?
?
模式動機:
?
-
在某些情況下,一個客戶不想或者不能直接引用一個對 象,此時可以通過一個稱之為“代理”的第三者來實現(xiàn) 間接引用。代理對象可以在客戶端和目標對象之間起到 中介的作用,并且可以通過代理對象去掉客戶不能看到 的內容和服務或者添加客戶需要的額外服務。
?
-
代理應用的場合:
-
遠程代理:也就是為一個對象在不同的地址空間提供局部代理,這樣可以隱藏一個對象存在于不同地址空間的事實。
-
虛擬代理:是根據(jù)需要創(chuàng)建很大的對象,通過它來代理來存放實例化需要很長時間的真實對象,例如:網頁加載圖片。
-
安全代理:用來控制真實對象訪問時的權限,一般用于對象應有不同的訪問權限的時候。
-
智能指引:是指當調用真實對象時,代理處理另外一些事情。
-
?
代碼:(通過代理去追妹子的例子):
?
?publicinterfaceIGiveGift{
? ? ? ?voidGiveDolls();
? ? ? ?voidGiveFlowers();
? ? ? ?voidGiveChocolate();
? ?}
? ?//此類中的@Data用到了lombok的注解,可以自動提供get ?set方法,節(jié)省代碼量
? ?//請參考“eclipse使用lombok”博客。
? ?importlombok.Data;
? ?public@DataclassSchoolGirl{
? ? ? ?Stringname;
? ?}
? ?publicclassPursuitimplementsIGiveGift{
? ? ? ?SchoolGirlmm;
? ? ? ?publicPursuit(SchoolGirlmm){
? ? ? ? ? ?super();
? ? ? ? ? ?this.mm=mm;
? ? ? ?}
? ? ? ?publicPursuit(){
? ? ? ? ? ?super();
? ? ? ?}
? ? ? ?@Override
? ? ? ?publicvoidGiveDolls(){
? ? ? ? ? ?// TODO Auto-generated method stub
? ? ? ? ? ?System.out.println(mm.getName()+"送你洋娃娃。");
? ? ? ?}
? ? ? ?@Override
? ? ? ?publicvoidGiveFlowers(){
? ? ? ? ? ?// TODO Auto-generated method stub
? ? ? ? ? ?System.out.println(mm.getName()+"送你鮮花。");
? ? ? ?}
? ? ? ?@Override
? ? ? ?publicvoidGiveChocolate(){
? ? ? ? ? ?// TODO Auto-generated method stub
? ? ? ? ? ?System.out.println(mm.getName()+"送你巧克力。");
? ? ? ?}
? ?}
? ?publicclassProxyimplementsIGiveGift{
? ? ? ?Pursuitgg;
? ? ? ?publicProxy(){
? ? ? ? ? ?super();
? ? ? ?}
? ? ? ?publicProxy(SchoolGirlmm){
? ? ? ? ? ?super();
? ? ? ? ? ?this.gg=newPursuit(mm);
? ? ? ?}
? ? ? ?@Override
? ? ? ?publicvoidGiveDolls(){
? ? ? ? ? ?// TODO Auto-generated method stub
? ? ? ? ? ?gg.GiveDolls();
? ? ? ?}
? ? ? ?@Override
? ? ? ?publicvoidGiveFlowers(){
? ? ? ? ? ?// TODO Auto-generated method stub
? ? ? ? ? ?gg.GiveFlowers();
? ? ? ?}
? ? ? ?@Override
? ? ? ?publicvoidGiveChocolate(){
? ? ? ? ? ?// TODO Auto-generated method stub
? ? ? ? ? ?gg.GiveChocolate();
? ? ? ?}
? ?}
? ?publicclassTest{
? ? ? ?publicstaticvoidmain(String[]args){
? ? ? ? ? ?SchoolGirlmm=newSchoolGirl();
? ? ? ? ? ?mm.setName("小美");
? ? ? ? ? ?Proxydaili=newProxy(mm);
? ? ? ? ? ?daili.GiveDolls();
? ? ? ? ? ?daili.GiveFlowers();
? ? ? ? ? ?daili.GiveChocolate();
? ? ? ?}
? ?}
?
代理模式結構圖:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?
?
- Subject接口,定義了RealSubject和Proxy的共用接口,這樣就在任何使用RealSubject的地方都可以使用Proxy。
?
publicinterfaceSubject
{
? ?publicvoidrequest();
}
-
RealSubject定義Proxy所代表的真實實體,實現(xiàn)了Subject接口。
publicRealSubjectimplementSubject
{
? ?publicvoidrequest()
{
? ? ? ?//真實請求
? ?}
}?
?
-
Proxy類,保存一個實體的引用使得代理可以訪問實體,并實現(xiàn)Subject的接口,這樣就可以用來代替實體。
publicclassProxyimplementSubject
{
? ?RealSubjectrealSubject;
? ?publicProxy(){
? ? ? ?realSubject=newRealSubject();
? ?}
? ?publicvoidrequest(){
? ? ? ?realSubject.request();? ? ?
? ?}
}
-
客戶端代碼:
publicstaticvoidmain(String[]args)
{
? ?Proxyproxy=newProxy();
? ?proxy.request();
}
?
?
?
?
?優(yōu)點
?
?
代理模式的優(yōu)點
-
代理模式能夠協(xié)調調用者和被調用者,在一定程度上降低了系 統(tǒng)的耦合度。
-
遠程代理使得客戶端可以訪問在遠程機器上的對象,遠程機器 可能具有更好的計算性能與處理速度,可以快速響應并處理客戶端請求。
-
虛擬代理通過使用一個小對象來代表一個大對象,可以減少系 統(tǒng)資源的消耗,對系統(tǒng)進行優(yōu)化并提高運行速度。
-
保護代理可以控制對真實對象的使用權限。
?
?
缺點
?
?
代理模式的缺點
-
由于在客戶端和真實主題之間增加了代理對象,因此 有些類型的代理模式可能會造成請求的處理速度變慢。
-
實現(xiàn)代理模式需要額外的工作,有些代理模式的實現(xiàn) 非常復雜。
?
?
適用環(huán)境
?
?
根據(jù)代理模式的使用目的,常見的代理模式有以下幾種類型:
-
遠程(Remote)代理:為一個位于不同的地址空間的對象提供一個本地 的代理對象,這個不同的地址空間可以是在同一臺主機中,也可是在 另一臺主機中,遠程代理又叫做大使(Ambassador)。
-
虛擬(Virtual)代理:如果需要創(chuàng)建一個資源消耗較大的對象,先創(chuàng)建一個消耗相對較小的對象來表示,真實對象只在需要時才會被真正創(chuàng)建。
-
Copy-on-Write代理:它是虛擬代理的一種,把復制(克隆)操作延遲 到只有在客戶端真正需要時才執(zhí)行。一般來說,對象的深克隆是一個 開銷較大的操作,Copy-on-Write代理可以讓這個操作延遲,只有對象被用到的時候才被克隆。
-
保護(Protect or Access)代理:控制對一個對象的訪問,可以給不同的用戶提供不同級別的使用權限。
-
緩沖(Cache)代理:為某一個目標操作的結果提供臨時的存儲空間,以便多個客戶端可以共享這些結果。
-
防火墻(Firewall)代理:保護目標不讓惡意用戶接近。
-
同步化(Synchronization)代理:使幾個用戶能夠同時使用一個對象而沒有沖突。
-
智能引用(Smart Reference)代理:當一個對象被引用時,提供一些額外的操作,如將此對象被調用的次數(shù)記錄下來等。
轉載于:https://www.cnblogs.com/to-string-hct/p/9363047.html
總結
以上是生活随笔為你收集整理的设计模式(三) | 为别人做嫁衣---代理模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Navicat 使用sql命令建数据库和
- 下一篇: asp.net ajax控件工具集 Au