原創文章,轉載請標注出處:《Java設計模式系列-代理模式》
一、概述
????????代理模式算是我接觸較早的模式,代理就是中介,中間人。法律上也有代理,比如代理律師之類,委托人將自己的一部分權限委托給代理者,代理者就擁有被代理者(委托人)的部分權限,并且可以以被代理人的名義來實行這些權限,此時代理者與委托人等同,當然代理人也可以在實行權限時配合自己的能力來進行,當然不能超出這個權限。
????????Java中的代理模式類似于上面的代理,我們也是為一個類(委托類)創建一個代理類,來代表它來對外提供功能。
????????如何在Java中創建一個類的代理類呢?
????????很簡單,我們需要創建一個公共接口,委托類要實現這個接口,再創建一個接口的實現類作為代理類,在這個類中的方法中可以直接調用委托類中的同名方法,外部類要進行訪問時,可以使用接口指向代理類實例,調用代理類中的方法,從而間接調用委托類中的具體方法實現。
二、示例
????????我們就以法律上的委托代理為例來寫個實例:
????????總接口:ZiRanRen
public interface ZiRanRen {
void Quanli();
}
????????委托人: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();
}
}
????????執行結果:
我賦予我的代理律師來行使這些權利,此時代理律師全權代理我處理某些事務
三、模式解析
????????上面是一個很簡單的例子,可以看出,我們想對外開放某些功能,就可以將這些功能在代理類中被引用,如此一來,屏蔽了我們不想外露的功能,只將我們想開放的功能開放出來。亦即委托類中其實是可以有很多方法的,很多功能的,我們可以酌情對外開放,代理類猶如一道大門,將委托類與外部調用者隔絕開來,只將部分功能賦予這個大門,來代替委托類行使這個功能,哪怕最終還是要牽扯到自身(因為最終還是要調用委托類的對應方法實現)。
????????代理模式很簡單,只要記住以下關鍵點,簡單易實現:
- 代理類與委托類實現同一接口
- 在委托類中實現功能,在代理類的方法中中引用委托類的同名方法
- 外部類調用委托類某個方法時,直接以接口指向代理類的實例,這正是代理的意義所在:屏蔽。
四、使用場景
????????代理模式場景描述:
- 當我們想要隱藏某個類時,可以為其提供代理類
- 當一個類需要對不同的調用者提供不同的調用權限時,可以使用代理類來實現(代理類不一定只有一個,我們可以建立多個代理類來實現,也可以在一個代理類中金進行權限判斷來進行不同權限的功能調用)
- 當我們要擴展某個類的某個功能時,可以使用代理模式,在代理類中進行簡單擴展(只針對簡單擴展,可在引用委托類的語句之前與之后進行)
五、總結
????????代理模式雖然實現了調用者與委托類之間的強耦合,但是卻增加了代理類與委托類之間的強耦合(在代理類中顯式調用委托類的方法),而且增加代理類之后明顯會增加處理時間,拖慢處理時間。