認識Java中的代理模式
首先來看一下代理模式的定義:
為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個對象不適合或者不能直接引用另一個對象,而代理對象可以在用戶端和目標對象之間起到中介的作用, 其特徵是代理類與委託類有同樣的介面。代理模式是常用的Java設計模式。
代理模式能夠在不修改源碼的情況下增強方法,在方法前後增加日誌記錄,許可權管理等功能。
表現形式如:
在java中,代理模式分成2種:靜態代理模式和動態代理模式;今天我們主要討論的是靜態代理。
1 靜態代理
靜態代理模式滿足如下的幾個條件:
a.代理對象的類是真實存在的,並非動態產生的。
b.代理對象持有被代理對象的引用
c.代理對象中的方法通過被代理對象的引用調用被代理對象的方法,同時執行代理邏輯。
下面是一個簡單的代理模式,相關代碼說明已經在注釋中給出,不再另外說明
介面類:
/*
更多資源 www.bkjia.com
* 介面
* 代理類和委託類都必須實現該類
*/
public interface ISubject {
//處理任務的抽象方法
public void dealTask(String task);
}
委託類:
/*
+V.X java8733 擷取更多資源
* 真實角色(被代理類,委託類)
* 實現介面Isubject
*/
public class RealSubject implements ISubject {
@Override
public void dealTask(String task) {
//真實角色處理任務
System.out.println("正在"+task);
}
}
代理類:
/*
更多資源 www.bkjia.com
* 代理類
* 實現ISubject介面
* 持有被代理類的引用
*/
public class Proxy implements ISubject {
//持有被代理類的引用
private RealSubject realSubject;
//在構造方法中初始化被代理類
public Proxy(RealSubject r) {
this.realSubject=r;
}
@Override
//在該方法中加入代理邏輯
public void dealTask(String task) {
System.out.println("開始幫忙....");
//加入線程睡眠類比幫忙的行為
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//真正執行動作的仍然是真實角色
realSubject.dealTask(task);
}
}
靜態工廠類:
/*
更多資源 www.bkjia.com
* 靜態工廠類
* 對於用戶端來說 並不關心執行動作的是代理對象還是真實角色
* 所以我們建立一個靜態方法直接返回對象
*/
public class StaticFactory {
//調用此方法獲得執行個體
public static ISubject getInstance(){
return new Proxy(new RealSubject());
}
}
測試類別:
/*
* 測試類別(客戶類)
更多資源 www.bkjia.ocm
*/
public class Test {
public static void main(String[] args) {
//建立代理對象時需要一個真實對象的執行個體
ISubject instance = StaticFactory.getInstance();
//使用代理類的方法
instance.dealTask("敲代碼");
}
}
就是這樣,真正的業務功能還是有委託類來實現,但是在實現業務類之前的一些公用服務。例如在項目開發中我們沒有加入緩衝,日誌這些功能,後期想加入,我們就可以使用代理來實現,而沒有必要開啟已經封裝好的委託類。