程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java的代理模式

Java的代理模式

編輯:關於JAVA
前幾天一個網友指出了我的文章中一些有失偏頗之處,那些文章都是我在閱讀Java Core的時候做的總結,順便加上我個人的一些理解。因為看的e文版,理解上有些地方可能還欠妥。下面談一下對Java中代理模式(Proxy)的認識。

代理,想必大家都應該知道是什麼冬冬了,一般的手機產商都有代理商,歌星們都有自己的經紀人,如此這些都可以看作是一種代理模式。下面我選擇如下的一種情景來進行講述:某董事長出差,但是此時公司有個聚會,董事長買單,但是由他的秘書去結帳。我們就權且把這個看作一個代理行為,^_^。

首先我們定義一個接口:商人(Merchant),如下所示:

package cn.edu.hust.cm.test;

public interface Merchant {

    void treat();//商人都要請客吃飯滴,^_^

}

    然後我們定義一個類:董事長(Director),如下所示:

package cn.edu.hust.cm.test;

public class Director implements Merchant {

       public Director() {

       }

       public void treat() {

              System.out.println("董事長請大家吃飯");

       }

}

OK,我們現在要給他找代理了,這個代理就是他的秘書(Secretary)。這裡要涉及到一些代理的機制了。在Java中,用來做代理的類一般都要實現InvocationHandler,實現它的invoke方法,至於為啥是這樣俺也不知道了,^_^。另外,當我們產生一個代理實例(proxy instance)的時候,只要我們通過這個實例調用任何方法,都會導致invoke方法的調用,還是看例子吧,如下所示:

package cn.edu.hust.cm.test;

 

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

 

public class Secretary implements InvocationHandler {

       public Secretary(Director director) {

              this.director=director;

       }

       public Object invoke(Object arg0, Method arg1, Object[] arg2)

                     throws Throwable {

        director.treat();

              System.out.println("由秘書結帳咯!");

              return null;

       }

       private Director director;

}

現在我們開始構建我們的主體測試代碼,如下面的代碼所示:

package cn.edu.hust.cm.test;


import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Proxy;


public class ProxyTest extends Proxy {

       public ProxyTest(InvocationHandler arg0) {

              super(arg0);

       }

       public static void main(String[] args) {

              Director director=new Director();

              InvocationHandler secretary=new Secretary(director);

              Merchant merchant=(Merchant)Proxy.newProxyInstance(director.getClass().getClassLoader(),director.getClass().getInterfaces(),secretary);

              merchant.treat();

       }

}

運行程序,輸出將為:董事長請客

由秘書結帳咯!

這裡有幾個要說明的地方,如下所述:

1.Proxy.newProxyInstance方法的作用,它的作用為某個對象創建一個代理對象,本例中是為director創建了一個代理對象,這個對象屬於哪個類呢?我們在程序裡面加這樣一句System.out.println(merchant.getClass().getName()),輸出是$Proxy0,呵呵,說明已經產生了一個代理類了,這個類實現了director所屬類中的所有接口。

2.代理的實現機制問題。個人覺得這個似乎就是一個事件處理的機制,當代理對象調用某個方法的時候,就會觸發相應的invoke方法。因此Proxy.newProxyInstance方法的第三個參數就相當於給這個代理對象注冊了一個監聽器。

Proxy類還有幾個方法,用法可以查看相應的API文檔。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved