1. 程式人生 > 其它 >大話Java代理模式

大話Java代理模式

一、什麼是代理

首先理解一下什麼是代理。簡單來說,代理就你要做一件事情,我替你把事情做了。這是現實生活中我們遇到的代理的需求場景。但寫程式碼的時候對代理場景的需求,跟現實場景有點區別,本質上還是幫你做事(呼叫要執行的方法),但在程式碼世界裡,如果僅僅只是把要呼叫的方法執行了,那完全沒有必要再新建類(代理類)去執行,因此,編碼的代理場景,更多體現在,我不但要替你把原本先做的事情(呼叫方法)做了,我還要把你不需要做、或不想做的事情給做了,我們稱其為方法的增強。

二、代理方式

眾所周知,java裡面的代理模式分為靜態代理和動態代理兩種方式。那如何理解這兩種代理方式呢?以前我總認為這兩種方式是對立的,這給我的理解帶來不小的阻礙。其實不然,後來我才發現,它們並不對立,而是解決編碼的過程中代理的兩種不同場景而已。
前面我們提到,編碼的代理需求,更多體現在於方法的增強。圍繞這個核心,有利於我們更好的理解兩者的異同。

  • 靜態代理

首先我們舉一個靜態代理的使用場景,有利於我們更好的理解。我始終相信每一項技術的發展,都是來著現實生活的推動。因此我們可以找一個現實場景進行類比。
比如近兩年的新冠疫情。在此插一句,祝人類早日戰勝疫情,早日擺脫口罩的束縛,早日自由暢快地呼吸。提到戰勝疫情,就不得不提到疫苗,人類想戰勝疫情,目前最好的方式就是疫苗的研發。那疫苗跟我們代理有啥關係呢?
我們都知道,疫苗在研發處理的初期,都是比較緊缺的,所以在初期,對疫苗的使用,肯定是先給最需要的人先使用。比如先給一線醫護人員使用。那打疫苗就得報名,她們還被告知是手動填表報名,可能我們的沒了的醫護天使在一線抗戰都非常忙,沒有時間報名,那這個時候有個小聰明就想,我也要為疫情抗戰出一份力,我沒法到一線工作,我只是能幫一線醫護人員報名,幫他們代理報名。這時候,一線醫護人員是一個特定的群體(對應我們的類),手動填表報名是一個要被代理的特定動作(一個方法),小聰明(代理類)代理報名。
為特定的類,固化的方法代理,我們稱之為靜態代理,是對原有業務邏輯的擴充。小聰明很明確,他要為一線醫護天使報名打疫苗,並處理一些雜七雜八的事情,不耽誤他們的工作。

  • 動態代理

後來隨著疫苗生產的加速推進,疫苗越來越多。對越來越多的群體開放,學生想報名,工人想報名,畫家想報名,程式設計師也想報名的,叫不上名的人都想報名。這時原先的手動填表已經滿足不了需求了。需求,沒錯,就是需求推動社會的進步,技術的發展。這時政府相關機構會開發通道,讓更多有能力的人或機構來幫忙解決報名的事情。你會看到,現在琳琅滿目的報名方式:網站報名,社群報名,小程式報名,各式各樣的報名方式被開發出來,只為一件事,就是報名。
對應我們的程式設計,其實的就是寫一個介面,報名渠道,比如說小程式,開放報名通道就是接口裡面提供報名的方法,不斷增加的各類群體都想通過小程式報名,是對介面方法的實現,小程式不斷的完善自己對各類群體的報名支援,我們可以理解為動態生成代理類。然後小程式完成報名,就是對人們報名需求的代理。通過這些代理進行報名,可以快速獲上交材料,獲得報名資格,這是對方法的增強。

  • 區別

可以看到,靜態代理和動態代理都提到了方法的增強,這是我們一直強調的代理的場景。那他們有什麼不同呢。從上面例子不難理解,動態代理是為了解決靜態代理的侷限性而產生的。靜態代理是對類裡特定方法的增強,而動態代理是對介面的裡方法的增強,只要實現該介面的類,都能實現方法的增強。由於實現介面的方法可以有無數個類,所以才有了動態代理的需求