代理這個概念,大家應該不陌生,像spring中的動態代理和jdk代理,以及webservice中都會用到代理模式。顧名思義,就是通過代理的方式完成一些事。
一、基本概念
爲其他對象提供一種代理以控制對這個對象的訪問。說白了就是,在一些情況下客戶不想或者不能直接引用一個對象,而代理對象可以在客戶和目標對象之間起到中介作用,去掉客戶不能看到的內容和服務或者增添客戶需要的額外服務
二、結構
● 抽象對象角色:聲明瞭目標對象和代理對象的共同接口,這樣一來在任何可以使用目標對象的地方都可以使用代理對象。
● 目標對象角色:定義了代理對象所代表的目標對象。
● 代理對象角色:代理對象內部含有目標對象的引用,從而可以在任何時候操作目標對象;代理對象提供一個與目標對象相同的接口,以便可以在任何時候替代目標對象。代理對象通常在客戶端調用傳遞給目標對象之前或之後,執行某個操作,而不是單純地將調用傳遞給目標對象。
三、代碼實現
首先,準備一個抽象對象角色:
package org.wuqiong.designpattern.proxypattern;
/**
* ClassName:AbstractObject <br/>
* Function: 抽象對象角色. <br/>
* Date: 2016年1月29日 下午4:17:04 <br/>
* @author qiyongkang
* @version
* @since JDK 1.6
* @see
*/
public abstract class AbstractObject {
//操作
public abstract void operation();
}
然後,準備一個目標對象角色:
package org.wuqiong.designpattern.proxypattern;
/**
* ClassName:RealObject <br/>
* Function: 目標對象角色. <br/>
* Date: 2016年1月29日 下午4:17:56 <br/>
* @author qiyongkang
* @version
* @since JDK 1.6
* @see
*/
public class RealObject extends AbstractObject {
@Override
public void operation() {
//一些操作
System.out.println("一些操作");
}
}
接下來,再準備一個代理對象角色:
/**
* ClassName:ProxyObject <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2016年1月29日 下午4:19:47 <br/>
*
* @author qiyongkang
* @version
* @since JDK 1.6
* @see
*/
public class ProxyObject extends AbstractObject {
RealObject realObject = new RealObject();
@Override
public void operation() {
// 調用目標對象之前可以做相關操作
System.out.println("before");
realObject.operation();
// 調用目標對象之後可以做相關操作
System.out.println("after");
}
}
最後,準備一個客戶端:
package org.wuqiong.designpattern.proxypattern;
/**
* ClassName:Client <br/>
* Function: TODO ADD FUNCTION. <br/>
* Reason: TODO ADD REASON. <br/>
* Date: 2016年1月29日 下午4:21:53 <br/>
* @author qiyongkang
* @version
* @since JDK 1.6
* @see
*/
public class Client {
public static void main(String[] args) {
AbstractObject obj = new ProxyObject();
obj.operation();
}
}
通過以上代碼分析,可以看出其實目標對象和代理對象做的核心事是一樣的,只不過代理對象還可以完成額外的任務,同時還可以把目標對象給隱藏起來。
其實,在spring中的面向切面編程,用到的就是代理模式。
好了,代理模式就講到這兒了。