代理模式:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問.說白了就是,在一些情況下客戶不想或不能直接引一個(gè)對(duì)象,而代理對(duì)象可以在客戶和目標(biāo)對(duì)象之間起到中介作用.去掉客戶不能看到的內(nèi)容和服務(wù)或都增添客戶需要的額外服務(wù). |
評(píng)論 共 20 條 | 發(fā)表評(píng)論 |
能否說下動(dòng)態(tài)代理的原理?比如,ci2.buy(); 為什么就能執(zhí)行,而ComputerProxy2 并沒有這個(gè)函數(shù)? |
動(dòng)態(tài)代理一定要實(shí)現(xiàn)這個(gè)InvocationHandle接口.接口里面有兩個(gè)方法.一個(gè)bind描述代理那個(gè)類,也就是與那個(gè)類有關(guān)系,主函數(shù)里我調(diào)用bind方法時(shí)給出Computer.也就是代理的Computer類.還有一個(gè)方法invoke就是代理與要執(zhí)行的方法. |
哦,我看錯(cuò)了,現(xiàn)在明白了,多謝! |
呵呵,客氣什么.互相學(xué)習(xí)吧. |
按照代理模式的定義 你為什么有搞一個(gè)動(dòng)態(tài)代理呢?有什么優(yōu)點(diǎn)兒? |
對(duì)啊,IBM的本只送鼠標(biāo).如果現(xiàn)在SONY的本送鼠標(biāo)和包,靜態(tài)的代理就實(shí)現(xiàn)不了了.只有改程序了.使用動(dòng)態(tài)代理,我們只關(guān)注買的是什么品牌的本.送的是什么東西. |
lyx_2709 寫道
對(duì)啊,IBM的本只送鼠標(biāo).如果現(xiàn)在SONY的本送鼠標(biāo)和包,靜態(tài)的代理就實(shí)現(xiàn)不了了.只有改程序了.使用動(dòng)態(tài)代理,我們只關(guān)注買的是什么品牌的本.送的是什么東西.
好,如果你讓你這個(gè)動(dòng)態(tài)代理去賣SONY的本子,他怎么送包?你還不是要修改invoke方法么? 動(dòng)態(tài)代理的好處并不是要?jiǎng)討B(tài)處理不同的任務(wù),而是動(dòng)態(tài)處理不同的類型,我所說的類型,指的是接口類型。 |
嗯,也有道理, |
lyx_2709 寫道
嗯,也有道理,
為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問,說白了就是,在一些情況下客戶不想或都不能直接引用一個(gè)對(duì)象,而代理對(duì)象可以在客戶和目標(biāo)對(duì)象之間起到中介作用,去掉客戶不能看到的內(nèi)容和服務(wù)或都增添客戶需要的額外服務(wù). 無論是什么代理商本是肯定的賣的,我們就要實(shí)現(xiàn)ComputerInterface這個(gè)接口,而不同的代理商優(yōu)惠的條件不同,在這里也就是說贈(zèng)的東西不同,我們代理的目的,和現(xiàn)時(shí)一樣,本本賣的基礎(chǔ)上,各個(gè)代理商送的東西不同.invoke這個(gè)方法在這里就描述了我們送的是什么東西. 我是這樣認(rèn)為的.
可能我們想的都一樣,只是描述的不是很清楚吧。 動(dòng)態(tài)代理和靜態(tài)代理的主要區(qū)別是,靜態(tài)代理已經(jīng)知道自己要代理什么類型的東西了,而動(dòng)態(tài)代理卻不知道。 但是動(dòng)態(tài)代理不知道,它可以代理一切,只要是有可代理的東西。 但是在代理商自己的附加動(dòng)作上,兩種代理方式應(yīng)該都是確定了的。 |
lyx_2709 寫道
代理模式:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問.說白了就是,在一些情況下客戶不想或不能直接引一個(gè)對(duì)象,而代理對(duì)象可以在客戶和目標(biāo)對(duì)象之間起到中介作用.去掉客戶不能看到的內(nèi)容和服務(wù)或都增添客戶需要的額外服務(wù).
給大家舉個(gè)比較簡單的例子: 假如你買臺(tái)IBM的筆記本,IBM產(chǎn)家是不提供鼠標(biāo)的.但是我們?nèi)绻麖拇砩痰氖掷镔I就有鼠標(biāo)和送. 很簡單的例子,寫幾個(gè)類來實(shí)現(xiàn)一下吧. 首先設(shè)計(jì)一個(gè)購買的接口代碼如下:(ComputerInterface.java) package test.lyx; publicinterface ComputerInterface { publicvoid buy(); } 建一個(gè)電腦類實(shí)現(xiàn)購買的接口代碼如下:(Computer.java) package test.lyx; publicclass Computer implements ComputerInterface{ private String pcName="IBMT60"; privateintpcPrice=17800; public String getPcName() { returnpcName; } publicvoid setPcName(String pcName) { this.pcName = pcName; } publicint getPcPrice() { returnpcPrice; } publicvoid setPcPrice(int pcPrice) { this.pcPrice = pcPrice; } publicvoid buy() { System.out.print("獲得筆記本電腦:"+pcName+"一臺(tái)"); } } 再建設(shè)一個(gè)代理商的類:用來完成買電腦和贈(zèng)送鼠標(biāo):(ComputerProxy.java) package test.lyx; publicclass ComputerProxy { private ComputerInterface pci; public ComputerInterface getPci() { returnpci; } publicvoid setPci(ComputerInterface pci) { this.pci = pci; } publicvoid buy(){ pci.buy(); System.out.println("贈(zèng)送鼠標(biāo)一個(gè)"); } } 建一個(gè)主函數(shù)測試一下吧:(TestDemo.java) package test.lyx; publicclass TestDemo { publicstaticvoid main(String[] args) { ComputerProxy c1=new ComputerProxy(); c1.setPci(new Computer()); c1.buy(); } } 運(yùn)行結(jié)果如下: 獲得筆記本電腦:IBMT60一臺(tái)獲得鼠標(biāo)一個(gè) 以上就是代理功能的實(shí)現(xiàn),由代理商銷售筆記本,并贈(zèng)送鼠標(biāo).但是這樣的程序只適合是銷售IBM筆記本. 對(duì)于這個(gè)代理的例子,我覺得有兩個(gè)問題:
第一,這個(gè)例子所表現(xiàn)的不是代理Proxy模式,而是裝飾器Decorator模式,Decorator模式正是這個(gè)例子所表現(xiàn)的為對(duì)象動(dòng)態(tài)的添加一些額外的功能或職責(zé); 第二,無論是Proxy模式還是Decorator模式,他們有一個(gè)相同的一點(diǎn)是他們與被代理和被裝飾的對(duì)象具有相同的接口,以便為客戶提供透明性,而這點(diǎn)上面的例子沒有實(shí)現(xiàn)。 對(duì)于Proxy和Decorator的比較,可以看看這篇帖子http://www.javaeye.com/topic/39053 |