天天看點

Java代理模式之蔡徐坤老師加深你的了解

代理模式

原始定義:Proxy pattern provides a surrogate or placeholder for another object in order to controll access to it

甯看懂了嗎?

翻譯:代理模式就是給某一個對象(被代理對象proxyee)提供一個“替身”或者“占位符”來達到控制這個對象的目的。

我注:也就是說,相比于之前我們直接操作這個對象(proxyee),我們通過操作代理對象(proxyer)來間接的操作proxyee。 這下懂了吧親?

靜态代理

從字面了解,就是有另一個人代替了你去做了本來你應該做的事情(在代碼中其實還是你自己做的,這裡先不管具體誰做的)。

靜态代理模式的優點:

  • 在不改變原有代碼的前提下增加功能
  • 幫助你了解AOP

    靜态代理模式的缺點:

  • 代理類必須實作被代理類實作的接口,一旦被代理類的功能增加,會牽扯到代理類的代碼。

這裡用一個例子來解釋靜态代理的流程和代碼。

我們假設你是蔡徐坤的經紀人,蔡徐坤自己跳舞是賺不到錢的,隻有你接到業務讓他跳舞他才有收入。

首先我們先建立一個功能接口叫做(如果對這裡為什麼要使用interface而不是class有疑問,這裡是java程式設計的慣例,一般來講,功能使用接口,實體使用類)

public interface talent{
	void dance();
	void sing();
}
           

然後我們建立出蔡徐坤,并且實作了他的天賦(talent 接口)

public class CaiXuKun implements talent{
	@override
	public void dance(){
		system.out.println("我是來自美國校隊的拉拉隊隊長,跳麻溜的");
	}
	@override 
	public void sing(){
		system.out.println("雞你太美");
	}

}
           

然後我們讓蔡徐坤自己表演下才藝(單獨運作下他的方法)

public class TestCaixukun {
    public static void main(String[] args) {
        CaiXuKun caiXuKun = new CaiXuKun();
        caiXuKun.sing();
        caiXuKun.dance();
    }

           
Java代理模式之蔡徐坤老師加深你的了解

然後發現他沒有收到錢!!!!!

現在的重點來了,我們要使用經紀人來代理業務了,建立一個代理對象就叫做ProxyManager吧

public class ProxyManager implements talent{
    CaiXuKun target; //這裡我們需要一個CaiXuKun的執行個體來保證還是caixukun本人在跳舞!!!!

    public void setTarget(CaiXuKun target) { 
        this.target = target;
    }

    @Override
    public void dance() {
        System.out.println("跳舞收費五十塊 ,請交錢!");//這裡就是我們添加的功能了!!!并且我們沒有動CaiXuKun的代碼!
        target.dance();
    }

    @Override
    public void sing() {
        System.out.println("蔡徐坤唱歌收費五十塊,請交錢!!!");//這裡就是我們添加的功能了!!!并且我們沒有動CaiXuKun的代碼!
        target.sing();
    }
}

在這裡使用代理類運作一下
public class TestCaixukun {
    public static void main(String[] args) {
        ProxyManager proxyManager = new ProxyManager();
        CaiXuKun caiXuKun = new CaiXuKun();
        proxyManager.setTarget(caiXuKun);
        proxyManager.dance();
        proxyManager.sing();
    }
}
           
Java代理模式之蔡徐坤老師加深你的了解

我們就成功了增加了功能了!!!! 你看懂了嗎!!!

現在你回頭看上面 代理模式的優點,映象應該會深刻和具體一點

動态代理 ()