10分鐘理解代理——靜態代理

引子:
如果你是一名程序員,那麼你肯定曾經聽說過一個名詞——“代理",有時你聽到的是”靜態代理“,有時則是”動態代理“。光從字面上看,差不多就能理解二則差異的50%(如果你還不知道什麼是代理)。靜態就是靜止不動,不會變化的;動態剛好相反。那麼問題的最根本的地方應該在於什麼是代理?

什麼是代理:
舉個形象的栗子:張三在某寶上買了一件T恤,收穫地址是住宅a地,某種原因導致物流比預期的晚了點,此時張三已到b地和妹子約會,以至於張三無法拿到快遞。爲了收下快遞員送上門的快遞,張三就會叫他的好基友鄰居李四幫忙收下。李四在幫忙領取快遞時只需要向快遞員解釋一下情況,回答一些有關張三的必要信息就可以從快遞小哥那接下包裹。那麼在這個過程中,李四就是代理,張三是被代理的對象。使用代理的好處就是及時的領取了快遞,張三也不必快馬加鞭趕回家去處理一件小事而耽誤了甜蜜時光,對不對?所以代理是個好東西。

什麼是動(靜)態代理:
再舉一個栗子:還是上面的情形。只不過王五需要找人幫忙澆一下門口的月季花,王五也是李四的好基友鄰居。李四幫忙領完張三的快遞後,又給王五的花澆了水。那麼王五就是”動態的代理“,既能幫助領快遞,又能幫助澆水(只要是好鄰居基友就能幫助)。如果李四隻幫助收取快遞而不做其他的,那麼李四此時就是靜態的代理了。


囉哩囉嗦了半天好像你該暈了。

下面我們用代碼來模擬一下上面的場景


靜態的代理比較容易理解,實現起來也比較簡單:
創建一個領快遞的接口:Receiver 它的一個主要方法是 void receive()接收快遞 
 
package staticproxy;

public interface Receiver {
void receive();

String getName();
}
  
然後在創建類Zhangshan,Lisi 實現 Receiver接口

張三類:

package staticproxy;

public class Zhangshan implements Receiver {

@Override
public void receive() {
System.out.println(getName() + "此時和妹妹在約會,無法收取快件");
}

@Override
public String getName() {
return "張三";
}

}

Lisi類
package staticproxy;

public class Lisi implements Receiver {

private Receiver receiver;

public Lisi(Receiver receiver) {
super();
this.receiver = receiver;
}

@Override
public void receive() {
receiver.receive();
System.out.println(this.getName() + "幫忙收取了" + receiver.getName() + "的快遞");
}

@Override
public String getName() {
return "李四";
}

}


區別是Zhangshan 的 receive()方法是行不通的(打印”張三此時和妹妹在約會,無法收取快件“)

測試類
package staticproxy;

public class TestStaticProxy {
public static void main(String[] args) {
Receiver zhangshan = new Zhangshan();
Receiver lisi = new Lisi(zhangshan);
lisi.receive();
}
}

運行結果:

張三此時和妹妹在約會,無法收取快件
李四幫忙收取了張三的快遞

從代碼上來看,代理的好處是,我們不需要直接調用zhangshan.receive()就能實現zhangshan.receive()的執行效果(打印”張三此時和妹妹在約會,無法收取快件“)。而是通過將張三設置成與張三擁有共同接口的李四的成員變量,通過李四的某些方法來觸發張三的目標方法。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章