做者 : Stanley 羅昊html
【轉載請註明出處和署名,謝謝!】java
寫在前面:*此章內容比較抽象,因此須要結合實際操做進行講解*設計模式
*須要有必定的java面向對象基礎*測試
首先,咱們須要創建一個java工程來實現一個例子,從而理解什麼是java中的靜態代理;spa
建好項目後,咱們須要在項目中新建一個包,而後在包下建一個接口,人的接口(Person),緊接着呢,咱們在接口中建立一個吃飯的方法:設計
這個方法就被稱之爲抽象方法,接下來呢,我將會去寫一個實現類,它們分別是,老師(Teacher)實現類,緊接着,咱們須要讓這個類實現Person這個接口,並實現Person類中定義好的抽象方法:3d
而且在改方法中輸出一句話,來表示這個方法的所執行的意義;代理
接下來呢,我再定義一個學生(Student)類,並全也去實現人類(Person),而且實現該類中的方法:指針
以上都建立完畢以後呢,咱們來創建一個測試類,將Student類實例化,調用學生吃零食這個方法:htm
打印結果就是 學生在吃零食。。。。。;
一樣的,咱們將老師類也在測試類中實例化,而且調用老師吃飯方法,那麼打印結果就是:
學生在吃零食。。。。。。
老師在吃飯。。。。。。
完成以上步驟以後呢,如今咱們的需求忽然要求加強;
需求變化:不管是老師仍是學生,我都須要讓他們在吃飯以前先跑一圈,吃飯以後,再去跑一圈;
咱們的需求發生了這樣的一個變化,你該如何實現呢?下面我列出幾個實現的策略:
這個就很好實現,好比,我如今要把學生類根據以上要求加強,咱們只須要去實現類中修改原方法便可:
如今,咱們再運行Test這個類看效果:
這種結果,是否是就是根據以上需求進行加強了;
注:可是,這種方式,很是不提倡使用,由於,實際開發中通常不會去修改以及提交的代碼,
由於你提交完成以後,別的小組就會調用你的這行代碼,因此,在實際開發當中,咱們不會輕易的去修改原始代碼;
代理主要做用:
來作一些須要加強的事情;
舉例:這個代理,就相似於,明星的經紀人。
咱們假設如今有一個演員王寶強,王寶強的經紀人是誰啊----------宋喆對吧;
王寶強最先出道的時候僅僅是一個小演員,小演員的時候,沒有經紀人,因此他只負責跑龍套就好了,跑龍套對他來講是徹底能夠應付過來的,可是隨着他愈來愈火,他已經不是演戲那麼簡單了,他除了演戲,他還須要拍廣告、還須要宣傳,這些都須要他幹對把,
演戲是否是須要他一我的去接戲啊,接廣告的話,是否是還須要去談這個廣告啊,若是他隻身一人的話,他還須要去接戲、接廣告、接宣傳,由於考慮到他經歷有限,是否是這些工做他一我的是沒法獨自完成的;
這個時候呢,王寶強就想到了一個辦法,請一個代理,也就是咱們所謂的經紀人;
經紀人乾的活就是王寶強能夠不親自去幹的活,而王寶強的核心業務是否是僅僅的去拍戲便可,一個經紀人能夠有經紀多個演員;
這個代理,是否是就相似於上面我所述的經紀人
被代理,是否是就是王寶強
剛纔,咱們用了第一種方式來實現了對需求進行了加強,很顯然,這樣作是不對的,在實際開發中,企業裏也不容許這樣去作,因此咱們把剛纔寫的那幾句打印輸出語句給刪掉;
那,接下來就改變一下需求:
學生在吃飯以前,須要買飯,吃完飯後須要扔垃圾
從以上需求,咱們大概能分析出來,吃飯是學生的核心,然而扔垃圾、買飯,是否是就是找一個經紀人就好了;
因此接下來,咱們就給學生找一個代理;
1.首先,咱們須要建一個類(ProxyStudent)
2.那麼ProxyStudent既然是學生的代理類,那麼就必需要有跟學生同樣的功能,另外輔助的功能後續再添加;
剛纔學生類實現了一個接口(Person),那麼它的代理類,也必需要去實現Person,吃飯的方法實際上仍是學生在作,
這裏的核心功能依然是學生本身的,底層調用的仍是學生本身的,也就是在個人這個代理對象中的吃飯這個方法裏面你必須去調用學生的;
既然須要在代理對象中,須要去調用學生吃飯的方法,那這個代理對象(ProxyStudent)的代理類中,是否是就須要有學生的屬性:
若是直接使用s.,執行必然是空指針異常,因此,咱們須要給這個學生對象使用構造器進行初始化;
那麼接下來,咱們再須要進行加強,咱們是否是僅須要在s.chifan();方法先後添加就行啦;
這樣以來,是否是就是對原始的方法進行了一次加強;
接下來,我再寫一個測試類(ProxyTest),進行測試;
那麼在測試類中,咱們僅須要調用代理對象便可,也就是說直接找宋喆,別再去找王寶強了,就是這樣意思.....
實例化代理對象以後,我是否是就能夠經過代理對象去調用個人吃飯方法啦;
來看下執行結果:
是否是代理幫我買大餐,我只負責吃飯,代理幫我扔垃圾;
那麼經過這樣的一個手段就實現了一個代理;
那麼,在以上的這個代理類中,真正的核心方法仍是被代理對象的,你這個吃飯的這個核心方法是否是就是吃零食啊;
學生正在吃零食是否是就是調用學生的,另外兩個是我本身拓展加上去的對吧;
而其餘的輔助的方法,是否是就算是代理去作了;
1.和被代理對象實現相同的接口
2.在代理類中,須要對被代理對象初始化
3.須要實現和被dialing對象相同的方法,而且在這個方法中核心(原始)業務調用被代理對象的,加強的業務在這裏進行加強就好了
靜態代理方式是有缺陷的;
1.若是有不少個對象須要找代理,那麼就須要實現不少個對象的代理類,這樣的話代碼臃腫,用戶體驗很通常;
2.若是被代理的方法過多,每一個方法都須要加強,代碼不整潔,大量搬用的工做
它有這兩大缺陷就形成了寫大型項目的時候,就不會用靜態代理這個設計模式
原文出處:https://www.cnblogs.com/StanleyBlogs/p/10761604.html