Java的代理模式(通過公共介面實現)

醉面韋陀發表於2010-04-01

代理模式的一種常見的實現方案是,定義一個介面或抽象類,並派生出目標子類,和代理子類。我們要操作的是目標子類裡的方法,而很多時候,我們需要為目錄子類中的方法增加額外的處理,如果增加日誌功能、條件判斷等,這時候,就很有必要用到代理類。

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->/**
 * 代理子類和目標子類的公共介面
 * 
@author rongxinhua
 *
 
*/
public interface MyInterface {
    
    
public void doOperation();

}

 

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->/**
 * 目標子類
 * 
@author rongxinhua
 *
 
*/
public class RealClass implements MyInterface {

    
/**
     * 我們要執行的目標方法
     
*/
    @Override
    
public void doOperation() {
        System.out.println(
"doOperation");
    }

}


而在沒有使用代理模式的情況下,我們是這樣執行目標方法的:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->        RealClass realObj = new RealClass();
        realObj.doOperation();    
//呼叫目標方法

列印時輸出:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->doOperation



而我們要加入額外的處理的話,就可以使用代理類了:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->/**
 * 代理子類
 * 
@author rongxinhua
 *
 
*/
public class ProxyClass implements MyInterface {

    
private MyInterface realObj;    //目標子類物件
    
    
public ProxyClass(MyInterface realObj) {
        
this.realObj = realObj;
    }
    
    
/**
     * 呼叫目標子類的方法,並在其中加入了前置處理和後置處理
     
*/
    @Override
    
public void doOperation() {
        doBefore();
        realObj.doOperation();
        doAfter();
    }
    
    
/**
     * 目標方法呼叫前的相關處理
     
*/
    
private void doBefore() {
        System.out.println(
"doBefore");
    }
    
    
/**
     * 目標方法呼叫後的相關處理
     
*/
    
private void doAfter() {
        System.out.println(
"doAfter");
    }

}


有了代理類,我們可以這樣執行目標方法:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->        ProxyClass proxyObj = new ProxyClass(new RealClass());
        proxyObj.doOperation();    
//通過代理物件呼叫doOperation方法


列印時輸出:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->doBefore
doOperation
doAfter


本文只是代理模式的在Java中的簡單使用,而代理模式與Java反射機制的整合,為Java元件開發增加了強大的生命力.

相關文章