六種常用的設計模式java實現(五)代理模式

代理這個概念,大家應該不陌生,像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中的面向切面編程,用到的就是代理模式。
好了,代理模式就講到這兒了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章