在我們實際生活中代理情況無處不在!你在淘寶上面買東西,你使用支付寶平台支付,賣家請物流公司發貨、你請朋友幫你拿包裹,在這個過程匯總支付寶、物流公司、你朋友都扮演者“第三者”的角色在幫你完成物品的購買,這里的第三者我們可以將其稱之為代理者。
所謂代理就通過引用一個新的對象來實現對真實對象的操作或者將新的對象當做真實對象的一個替身,這種實現的機制就是代理模式,通過引用代理對象來訪問真實對象就是代理模式的設計動機。
一、 模式定義
代理模式就是給一個對象提供一個代理,並由代理對象控制對原對象的引用。
在代理模式中,“第三者”代理主要是起到一個中介的作用,它連接客戶端和目標對象。
二、 模式結構
下圖是代理模式UML結構圖
在代理模式中有如下三個角色:
Subject: 抽象角色。聲明真實對象和代理對象的共同接口。
Proxy: 代理角色。代理對象與真實對象實現相同的接口,所以它能夠在任何時刻都能夠代理真實對象。代理角色內部包含有對真實對象的引用,所以她可以操作真實對象,同時也可以附加其他的操作,相當於對真實對象進行封裝。
RealSubject: 真實角色。它代表着真實對象,是我們最終要引用的對象
三、 模式實現
讀大學的時候都追過女生吧!某天你看到一位美女,一見鍾情,心里發誓要她做你女朋友。但是你想這樣直接上去可能會唐突了。於是你采用迂回政策,先和她室友搞好關系,然后通過她室友給她禮物,然后……。
首先出現的就是美女一枚:BeautifulGirl.java
public class BeautifulGirl {
String name;
public BeautifulGirl(String name){
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后是抽象主題,送禮物接口:GiveGift.java
public interface GiveGift {
/**
* 送花
*/
void giveFlowers();
/**
* 送巧克力
*/
void giveChocolate();
/**
* 送書
*/
void giveBook();
}
你小子:You.java
public class You implements GiveGift {
BeautifulGirl mm ; //美女
public You(BeautifulGirl mm){
this.mm = mm;
}
public void giveBook() {
System.out.println(mm.getName() +",送你一本書....");
}
public void giveChocolate() {
System.out.println(mm.getName() + ",送你一盒巧克力....");
}
public void giveFlowers() {
System.out.println(mm.getName() + ",送你一束花....");
}
}
她閨蜜室友:HerChum.java
public class HerChum implements GiveGift{
You you;
public HerChum(BeautifulGirl mm){
you = new You(mm);
}
public void giveBook() {
you.giveBook();
}
public void giveChocolate() {
you.giveChocolate();
}
public void giveFlowers() {
you.giveFlowers();
}
}
客戶端:Client.java
public class Client {
public static void main(String[] args) {
BeautifulGirl mm = new BeautifulGirl("小屁孩...");
HerChum chum = new HerChum(mm);
chum.giveBook();
chum.giveChocolate();
chum.giveFlowers();
}
}
運行結果
小屁孩...,送你一本書....
小屁孩...,送你一盒巧克力....
小屁孩...,送你一束花....
好了禮物已經送出去了,能不能搞定就看你的魅力了!!!!
四、 模式優缺點
優點
1、 代理模式能夠協調調用者和被調用者,在一定程度上降低了系統的耦合度。
2、 代理對象可以在客戶端和目標對象之間起到中介的作用,這樣起到了的作用和保護了目標對象的
缺點
1、由於在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。
2、 實現代理模式需要額外的工作,有些代理模式的實現非常復雜。
五、 模式適用場景
1、 遠程代理:為一個對象在不同的地址空間提供局部代表。這樣可以隱藏一個對象存在於不同地址空間的事實。
2、 虛擬代理:通過使用過一個小的對象代理一個大對象。這樣就可以減少系統的開銷。
3、 保護代理:用來控制對真實對象的訪問權限。
六、 模式總結
1、代理模式是通過使用引用代理對象來訪問真實對象,在這里代理對象充當用於連接客戶端和真實對象的中介者。
2、代理模式主要用於遠程代理、虛擬代理和保護代理。其中保護代理可以進行訪問權限控制。