代理模式
代理模式,看起來非常像裝飾器模式。
對裝飾器模式來說,裝飾者(decorator)和被裝飾者(decoratee)都實現同一個 接口。對代理模式來說,代理類(proxy class)和真實處理的類(real class)也都實現同一個接口。此外,不論我們使用哪一個模式,都可以很容易地在真實對象的方法前面或者後面加上自定義的方法。
然而,實際上,在裝飾器模式和代理模式之間還是有很多差別的。裝飾器模式關注於在一個對象上動態的添加方法,然而代理模式關注於控制對對象的訪問。換句話 說,用代理模式,代理類(proxy class)可以對它的客戶隱藏一個對象的具體信息。因此,當使用代理模式的時候,我們常常在一個代理類中創建一個對象的實例。並且,當我們使用裝飾器模式的時候,我們通常的做法是將原始對象作爲一個參數傳給裝飾者的構造器。使用代理模式,代理和真實對象之間的的關係通常在編譯時就已經確定了,而裝飾者能夠在運行時遞歸地被構造。
代理,偏重因自己無法完成或自己無需關心,需要他人干涉事件流程,更多的是對對象的控制。
裝飾,偏重對原對象功能的擴展,擴展後的對象仍是是對象本身。
代理模式,注重對對象某一功能的流程把控和輔助。它可以控制對象做某些事,重心是爲了借用對象的功能完成某一流程,而非對象功能如何。
裝飾模式,注重對對象功能的擴展,它不關心外界如何調用,只注重對對象功能的加強,裝飾後還是對象本身。
對於代理類,如何調用對象的某一功能是思考重點,而不需要兼顧對象的所有功能;
對於裝飾類,如何擴展對象的某一功能是思考重點,同時也需要兼顧對象的其它功能,因爲再怎麼裝飾,本質也是對象本身,要擔負起對象應有的職責。
依舊我們來舉個例子,好理解一下,小明想要出國去旅遊,但是呢,小明是第一次,所以,對整個流程都不熟悉,需要一個人來幫他來完成這些事情,所以就找了一家旅遊公司,那麼這個旅遊公司呢,就是這個代理了,在小明出國旅遊之前,就確定了是小明與旅遊公司的關係。
看一下代碼
/**
* @author: hx
* @Time: 2019/5/13
* @Description: People
*/
public interface People {
/**
* 人們都可以去旅遊
*/
void travelling();
}
/**
* @author: hx
* @Time: 2019/5/13
* @Description: Xiaoming
*/
public class Xiaoming implements People {
@Override
public void travelling() {
System.out.println("小明去旅遊");
}
}
/**
* @author: hx
* @Time: 2019/5/13
* @Description: TravelAgency
*/
public class TravelAgency implements People {
private Xiaoming mXiaoming;
public TravelAgency() {
mXiaoming = new Xiaoming();
}
@Override
public void travelling() {
beforeTravel();
mXiaoming.travelling();
afterTravel();
}
/**
* 旅遊前的事情
*/
private void beforeTravel(){
System.out.println("辦證");
System.out.println("買機票");
System.out.println("買保險");
System.out.println("找導遊");
}
/**
* 旅遊後的事情
*/
private void afterTravel(){
System.out.println("返程機票");
}
}
小明出去旅個遊:
public static void main(String[] args){
People agency = new TravelAgency();
agency.travelling();
}
輸出結果:
辦證
買機票
買保險
找導遊
小明去旅遊
返程機票
採用一個代理類調用原有的方法,且對產生的結果進行控制。這種方法就是代理模式。
使用代理模式,可以將功能劃分的更加清晰,有助於後期維護!