代理模式是由GoF提出的23種軟件設計模式的一種。其定義為:為其他對象提供一種代理以控制對這個對象的訪問。別名:Surrogate。
所謂代理,是指具有與代理元(被代理的對象)具有相同的接口的類,客戶端必須通過代理與被代理的目標類交互,而代理一般在交互的過程中(交互前后),進行某些特別的處理。Proxy模式是很常見的模式,在我們生活中處處可見,例如我們買火車票不一定非要到火車站去買,可以到一些火車票的代售點去買。寄信不一定是自己去寄,可以把信委托給郵局,由郵局把信送到目的地。
代理結構如下圖所示
以通過代售點買火車票為例,代碼實現如下:
//提供買票的公共接口
interface Passenger {
public void buyTicket();
}
//乘客實體
public class RealPassenger implements Passenger {
@Override
public void buyTicket() {
?? // TODO Auto-generated method stub
?? System.out.print("購買了火車票");
}
}
//代售點
public class Proxy implements Passenger {
Passenger passenger;
public Proxy(Passenger p) {
?? this.passenger = p;
}
@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();
}
}
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
