Java 代理/動態代理模式(Proxy)

代理模式是由GoF提出的23種軟件設計模式的一種。其定義爲:爲其餘對象提供一種代理以控制對這個對象的訪問。別名:Surrogate。
所謂代理,是指具備與代理元(被代理的對象)具備相同的接口的類,客戶端必須經過代理與被代理的目標類交互,而代理通常在交互的過程當中(交互先後),進行某些特別的處理。Proxy模式是很常見的模式,在咱們生活中到處可見,例如咱們買火車票不必定非要到火車站去買,能夠到一些火車票的代售點去買。寄信不必定是本身去寄,能夠把信委託給郵局,由郵局把信送到目的地。 java

代理結構以下圖所示 設計模式

Java 代理/動態代理模式(Proxy) - stevinzhu - stevinzhu的博客

以經過代售點買火車票爲例,代碼實現以下: api

//提供買票的公共接口
interface Passenger {
public void buyTicket();
} ide

//乘客實體
public class RealPassenger implements Passenger {
@Override
public void buyTicket() {
   // TODO Auto-generated method stub
   System.out.print("購買了火車票");
}
} 測試

//代售點
public class Proxy implements Passenger {
Passenger passenger; this

public Proxy(Passenger p) {
   this.passenger = p;
} spa

@Override
public void buyTicket() {
   // TODO Auto-generated method stub
   System.out.println("經過代售點");
   passenger.buyTicket();
}
} 設計

//測試類
public class Client {
public static void main(String[] args) {
   Passenger passenger = new RealPassenger();
   Passenger proxy = new Proxy(passenger);
   proxy.buyTicket();
}
} 代理

輸出結果:
經過代售點
購買了火車票 對象

以上的也可叫作靜態代理,是爲了區別代理模式在Java中的另外一種實現——動態代理。動態代理的應用十分普遍,在struts2的攔截器中就用到了動態代理機制。仍是以買車票爲例子,如今用動態代理來實現,其中不懂的接口方法查查Java api就會明白了,在此很少作解釋,代碼以下(注意PassengerProxy類):

import java.lang.reflect.*;

public interface Passenger {
public void buyTicket();
}

public class RealPassenger implements Passenger {

@Override
public void buyTicket() {
   // TODO Auto-generated method stub
   System.out.println("購買了車票");
}
}

// 用動態代理實現
public class PassengerProxy implements InvocationHandler {
public Object obj;

// 把obj交給代理類
public Object obj(Object obj) {
   this.obj = obj;
   return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
     .getClass().getInterfaces(), this);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
   // TODO Auto-generated method stub
   System.out.println("經過代理");
   method.invoke(obj, args);
   return null;
}
}

public class Client { public static void main(String[] args) {    PassengerProxy proxy = new PassengerProxy();    Passenger passenger = (Passenger) proxy.obj(new RealPassenger());    passenger.buyTicket(); } }

相關文章
相關標籤/搜索