簡(jiǎn)述:
為其他對(duì)象提供一種代理厕鹃,以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。
代理對(duì)象起到中介的作用乍丈,可以去掉某些功能剂碴,也可以增加某些功能。
常見(jiàn)的代理模式:
虛擬代理:
當(dāng)我們?cè)跒g覽帖子的時(shí)候轻专,很多帖子的圖片剛開(kāi)始都是默認(rèn)網(wǎng)站logo忆矛,當(dāng)圖片加載完成的時(shí)候才會(huì)去顯示出來(lái),在圖片被加載的時(shí)候请垛,也不會(huì)影響我們?nèi)タ次淖帧?/p>
代理模式分為靜態(tài)代理和動(dòng)態(tài)代理催训。
靜態(tài)代理:
代理和被代理對(duì)象在代理之前是確定的洽议,他們都實(shí)現(xiàn)相同的接口或者繼承相同的抽象類(lèi)。
下面我們用靜態(tài)代理做一個(gè)小Demo
假如我們有一輛車(chē)漫拭,然后我們通過(guò)靜態(tài)代理來(lái)記錄這輛車(chē)行駛的時(shí)間绞铃。
首先寫(xiě)一個(gè)汽車(chē)的接口,增加行駛的方法:
public interface Moveable {
//增加一個(gè)行駛的接口
void move();
}
創(chuàng)建汽車(chē)類(lèi)嫂侍,實(shí)現(xiàn)move
方法:
public class Car implements Moveable {
@Override
public void move() {
//實(shí)現(xiàn)開(kāi)車(chē),開(kāi)車(chē)時(shí)間為1秒鐘
try {
Thread.sleep(new Random().nextInt(1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
最后我們創(chuàng)建一個(gè)Car2
類(lèi)儿捧,繼承Car
類(lèi),重寫(xiě)move()
方法挑宠,并且在實(shí)現(xiàn)的前后增加業(yè)務(wù):
@Override
public void move() {
long starttime = System.currentTimeMillis();
System.out.println("汽車(chē)開(kāi)始行駛...");
super.move();
long endtime = System.currentTimeMillis();
System.out.println("汽車(chē)結(jié)束行駛...");
System.out.println("汽車(chē)行駛時(shí)間:" + (endtime - starttime) + "毫秒菲盾!");
}
public static void main(String[] args) {
Moveable m = new Car2();
m.move();
}
}
輸出結(jié)果:
汽車(chē)開(kāi)始行駛...
汽車(chē)結(jié)束行駛...
汽車(chē)行駛時(shí)間:868毫秒!