Java動態代理模式
代理:一個角色代表別一個角色來實現某些特定的能功。
比如:生產商,中間商,客戶這三者這間的關系
客戶買產品不並直接與生產商打交道,也用不曉得產品是如何生產的,客戶只與中間商打交道,而中間商便可以對產品行進一些包裝,供提一些售後的服務。
代理模式有三個角色: 1. 抽象主題角色 2. 代理主題角色 3. 際實被代理角色
面下我們來個一個靜態代理的現實。
我以一個坦克為例。
抽象主題角色:Moveable
代碼如下:
package com.gjy.proxy;
public interface Moveable {
void move();
}
代理主題角色:TanktimeProxy
代碼如下:
package com.gjy.proxy;
public class TanktimeProxy implements Moveable{
private Moveable t;
public TanktimeProxy(Moveable t) {
super();
this.t = t;
}
@Override
public void move() {
long time1 = System.currentTimeMillis();
System.out.println("time1="+time1);
t.move();
long time2 = System.currentTimeMillis();
System.out.println("time2="+time2);
System.out.println("運行間時為:"+(time2-time1));
}
}
際實被代理對象:Tank
代碼如下:
package com.gjy.proxy;
public class Tank implements Moveable{
@Override
public void move() {
System.out.println("TanK moving........");
}
}
測試:
代碼如下:
package com.gjy.proxy;
public class TestTank {
public static void main(String[] args) {
Tank t = new Tank();
Moveable move = new TanktimeProxy(t);
move.move();
}
}
面下我想在TanK的move()方法前後加上日記:
我必須再寫一個類來現實這一能功:
代碼如下:
package com.gjy.proxy;
public class TanklogProxy implements Moveable{
private Moveable t;
public TanklogProxy(Moveable t) {
super();
this.t = t;
}
@Override
public void move() {
System.out.println("start move........");
t.move();
System.out.println("end move......");
}
}
測試:
代碼如下:
package com.gjy.proxy;
public class TestTank {
public static void main(String[] args) {
Tank t = new Tank();
Moveable move = new TanktimeProxy(t);
Moveable movet = new TanklogProxy(move);
movet.move();
}
}
這樣我通過代理在Tank的move()方法前後入加了日記和間時統計的能功,由於TanktimeProxy,TanklogProxy都現實了Moveable口接,所以TanklogProxy可以代理TanktimeProxy,反過來也可以,它們對Tank的代理次序是可以交換的。
如果我想在Tank的move()方法用調的前後入加更多的能功,是否是要寫更多的代理主題角色,這子樣會使得碼代過於癡肥,不易於維護,那有沒有什麼方法可以處理呢,案答是可以的,我們可以動態的來成生代理主題角色,來代理全部的被代理對象,這就是動態代理。
文章結束給大家分享下程序員的一些笑話語錄: IBM和波音777
波音777是有史以來第一架完全在電腦虛擬現實中設計制造的飛機,所用的設備完全由IBM公司所提供。試飛前,波音公司的總裁非常熱情的邀請IBM的技術主管去參加試飛,可那位主管卻說道:“啊,非常榮幸,可惜那天是我妻子的生日,So..”..
波音公司的總載一聽就生氣了:“膽小鬼,我還沒告訴你試飛的日期呢!”