標籤:很多 不同 之間 應用 直接 bsp int 擴充 may
代理模式算是我接觸較早的模式,代理就是中介,中間人。法律上也有代理,比如代理律師之類,委託人將自己的一部分許可權委託給代理者,代理者就擁有被代理者(委託人)的部分許可權,並且可以以被代理人的名義來實行這些許可權,此時代理者與委託人等同,當然代理人也可以在實行許可權時配合自己的能力來進行,當然不能超出這個許可權。
Java中的代理模式類似於上面的代理,我們也是為一個類(委託類)建立一個代理類,來代表它來對外提供功能。
如何在Java中建立一個類的代理類呢?
很簡單,我們需要建立一個公用介面,委託類要實現這個介面,再建立一個介面的實作類別作為代理類,在這個類中的方法中可以直接調用委託類中的同名方法,外部類要進行訪問時,可以使用介面指向代理類執行個體,調用代理類中的方法,從而間接調用委託類中的具體方法實現。
我們就以法律上的委託代理為例來寫個執行個體:
總介面:ZiRanRen
1 public interface ZiRanRen {2 void Quanli();3 }
委託人:MaYun
public class MaYun implements ZiRanRen { public void eat() { System.out.println("今天吃滿漢全席"); } public void drink() { System.out.println("今天喝大西洋"); } @Override public void Quanli() { System.out.println("我賦予我的代理律師來行使這些權利,此時代理律師全權代理我處理某些事務"); }}
代理律師:LvShi
public class LvShi implements ZiRanRen { @Override public void Quanli() { new MaYun().Quanli(); } }
測試類別:Clienter
public class Clienter { public static void main(String[] args) { ZiRanRen ls = new LvShi(); ls.Quanli(); } }
執行結果:
我賦予我的代理律師來行使這些權利,此時代理律師全權代理我處理某些事務
上面是一個很簡單的例子,可以看出,我們想對外開放某些功能,就可以將這些功能在代理類中被引用,如此一來,屏蔽了我們不想外露的功能,只將我們想開放的功能開放出來。亦即委託類中其實是可以有很多方法的,很多功能的,我們可以酌情對外開放,代理類猶如一道大門,將委託類與外部調用者隔絕開來,只將部分功能賦予這個大門,來代替委託類行使這個功能,哪怕最終還是要牽扯到自身(因為最終還是要調用委託類的對應方法實現)。
代理模式很簡單,只要記住以下關鍵點,簡單易實現:
(1)代理類與委託類實現同一介面
(2)在委託類中實現功能,在代理類的方法中中引用委託類的同名方法
(3)外部類調用委託類某個方法時,直接以介面指向代理類的執行個體,這正是代理的意義所在:屏蔽。
代理模式情境描述:
(1)當我們想要隱藏某個類時,可以為其提供代理類
(2)當一個類需要對不同的調用者提供不同的調用許可權時,可以使用代理類來實現(代理類不一定只有一個,我們可以建立多個代理類來實現,也可以在一個代理類中金進行許可權判斷來進行不同許可權的功能調用)
(3)當我們要擴充某個類的某個功能時,可以使用代理模式,在代理類中進行簡單擴充(只針對簡單擴充,可在引用委託類的語句之前與之後進行)
代理模式雖然實現了調用者與委託類之間的強耦合,但是卻增加了代理類與委託類之間的強耦合(在代理類中顯式調用委託類的方法),而且增加代理類之後明顯會增加處理時間,拖慢處理時間。
Java設計模式之《代理模式》及應用情境