摘要:什么是代理大道理上講代理是一種軟件設(shè)計(jì)模式,目的地希望能做到代碼重用。這個(gè)就好比商戶明星經(jīng)紀(jì)人代理明星這種模式。
(1)什么是代理?
大道理上講代理是一種軟件設(shè)計(jì)模式,目的地希望能做到代碼重用。具體上講,代理這種設(shè)計(jì)模式是通過(guò)不直接訪問(wèn)被代理對(duì)象的方式,而訪問(wèn)被代理對(duì)象的方法。這個(gè)就好比 商戶---->明星經(jīng)紀(jì)人(代理)---->明星這種模式。我們可以不通過(guò)直接與明星對(duì)話的情況下,而通過(guò)明星經(jīng)紀(jì)人(代理)與其產(chǎn)生間接對(duì)話
(2)什么情況下使用代理?
a. 設(shè)計(jì)模式中有一個(gè)設(shè)計(jì)原則是開閉原則,是說(shuō)對(duì)修改關(guān)閉對(duì)擴(kuò)展開放,我們?cè)诠ぷ髦杏袝r(shí)會(huì)接手很多前人的代碼,里面代碼邏輯讓人摸不著頭腦(sometimes the code is really like shit),這時(shí)就很難去下手修改代碼,那么這時(shí)我們就可以通過(guò)代理對(duì)類進(jìn)行增強(qiáng)。
b. 我們?cè)谑褂肦PC框架的時(shí)候,框架本身并不能提前知道各個(gè)業(yè)務(wù)方要調(diào)用哪些接口的哪些方法 。那么這個(gè)時(shí)候,就可用通過(guò)動(dòng)態(tài)代理的方式來(lái)建立一個(gè)中間人給客戶端使用,也方便框架進(jìn)行搭建邏輯,某種程度上也是客戶端代碼和框架松耦合的一種表現(xiàn)。
(3)靜態(tài)代理和動(dòng)態(tài)代理
靜態(tài)代理比較簡(jiǎn)單,主要是多態(tài)實(shí)現(xiàn),這里主要記錄下動(dòng)態(tài)代理
定義代理父類
package cn.crawler.split.test.proxy; /** * Created by liang.liu04@hand-china.com * on 2018/7/12 */ public interface Father { public void rent(); public void hello(String str); }
子類
/** * Created by liang.liu04@hand-china.com * on 2018/7/12 */ public class Son implements Father { @Override public void rent() { System.out.println("I want to rent my house"); } @Override public void hello(String str) { System.out.println("hello: " + str); } }
代理類
package cn.crawler.split.test.proxy; import org.springframework.cglib.proxy.InvocationHandler; import java.lang.reflect.Method; /** * Created by liang.liu04@hand-china.com * on 2018/7/12 */ public class DynamicProxy implements InvocationHandler { // 這個(gè)就是我們要代理的真實(shí)對(duì)象 private Object subject; // 構(gòu)造方法,給我們要代理的真實(shí)對(duì)象賦初值 public DynamicProxy(Object subject) { this.subject = subject; } @Override public Object invoke(Object object, Method method, Object[] args) throws Throwable { // 在代理真實(shí)對(duì)象前我們可以添加一些自己的操作 System.out.println("before rent house"); System.out.println("Method:" + method); // 當(dāng)代理對(duì)象調(diào)用真實(shí)對(duì)象的方法時(shí),其會(huì)自動(dòng)的跳轉(zhuǎn)到代理對(duì)象關(guān)聯(lián)的handler對(duì)象的invoke方法來(lái)進(jìn)行調(diào)用 method.invoke(subject, args); // 在代理真實(shí)對(duì)象后我們也可以添加一些自己的操作 System.out.println("after rent house"); return null; } }
測(cè)試類
package cn.crawler.split.test.proxy; import org.springframework.cglib.proxy.InvocationHandler; import org.springframework.cglib.proxy.Proxy; /** * Created by liang.liu04@hand-china.com * on 2018/7/12 */ public class MyProxyTest { public static void main (String[] stra){ //代理對(duì)象 Father son = new Son(); System.out.println(son.getClass()); InvocationHandler handler = new DynamicProxy(son); Father father = (Father)Proxy.newProxyInstance(handler.getClass().getClassLoader(), son.getClass().getInterfaces(), handler); System.out.println(father.getClass().getName()); father.rent(); father.hello("world"); } }
測(cè)試結(jié)果:
class cn.crawler.split.test.proxy.Son org.springframework.cglib.proxy.Proxy$ProxyImpl$$EnhancerByCGLIB$$f4f3d897 before rent house Method:public abstract void cn.crawler.split.test.proxy.Father.rent() I want to rent my house after rent house before rent house Method:public abstract void cn.crawler.split.test.proxy.Father.hello(java.lang.String) hello: world after rent house
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/71562.html
摘要:動(dòng)態(tài)代理又被稱為代理或接口代理。靜態(tài)代理在編譯時(shí)產(chǎn)生字節(jié)碼文件,可以直接使用,效率高。代理無(wú)需實(shí)現(xiàn)接口,通過(guò)生成類字節(jié)碼實(shí)現(xiàn)代理,比反射稍快,不存在性能問(wèn)題,但會(huì)繼承目標(biāo)對(duì)象,需要重寫方法,所以目標(biāo)對(duì)象不能為類。 一、代理模式介紹 代理模式是一種設(shè)計(jì)模式,提供了對(duì)目標(biāo)對(duì)象額外的訪問(wèn)方式,即通過(guò)代理對(duì)象訪問(wèn)目標(biāo)對(duì)象,這樣可以在不修改原目標(biāo)對(duì)象的前提下,提供額外的功能操作,擴(kuò)展目標(biāo)對(duì)象的功...
摘要:除了和外,我們還有最后一招我直接把一個(gè)代理類的源代碼用字符串拼出來(lái),然后基于這個(gè)字符串調(diào)用的編譯期,動(dòng)態(tài)的創(chuàng)建一個(gè)新的文件,然后動(dòng)態(tài)編譯這個(gè)文件,這樣也能得到一個(gè)新的代理類。 面試問(wèn)題:Java里的代理設(shè)計(jì)模式(Proxy Design Pattern)一共有幾種實(shí)現(xiàn)方式?這個(gè)題目很像孔乙己?jiǎn)栜钕愣沟能钭钟心膸追N寫法? showImg(https://segmentfault.com/...
摘要:代理模式基本概念不論是靜態(tài)代理還是動(dòng)態(tài)代理其本質(zhì)都是代理模式的一種實(shí)現(xiàn)那么什么是代理模式呢代理模式即給某一個(gè)對(duì)象提供一個(gè)代理并由代理對(duì)象控制對(duì)原對(duì)象的引用代理模式其實(shí)取材于實(shí)際生活例如我們生活中常見的房屋租賃代理我們?cè)谧夥繒r(shí)一般不是直接和房 代理模式 基本概念 不論是靜態(tài)代理還是動(dòng)態(tài)代理, 其本質(zhì)都是代理模式的一種實(shí)現(xiàn), 那么什么是代理模式呢?代理模式, 即給某一個(gè)對(duì)象提供一個(gè)代理, ...
摘要:動(dòng)態(tài)代理的產(chǎn)生就是這樣而來(lái)的。在的方案中我們只需要這樣做可以實(shí)現(xiàn)動(dòng)態(tài)代理了。委托類實(shí)際執(zhí)行類利用提供的實(shí)現(xiàn)動(dòng)態(tài)代理代理環(huán)繞執(zhí)行實(shí)際的方法利用的實(shí)現(xiàn)代理動(dòng)態(tài)代理,有幾個(gè)關(guān)鍵點(diǎn),一個(gè)就是接口,這個(gè)方法中的方法是執(zhí)行代理時(shí)會(huì)執(zhí)行的方法。 什么是代理? 代理是一種設(shè)計(jì)模式,簡(jiǎn)單的說(shuō)就是為某個(gè)對(duì)象提供代理,以控制這個(gè)對(duì)象的訪問(wèn),在不修改原方法的情況下做方法增強(qiáng),簡(jiǎn)單的可以分為兩種: 靜態(tài)代理 ...
摘要:要明白,動(dòng)態(tài)代理類的存在意義是為了攔截方法并修改邏輯而動(dòng)態(tài)代理的局限性之一就是只能攔截接口所聲明的方法。因?yàn)閯?dòng)態(tài)代理類是繼承自業(yè)務(wù)類,所以該類和方法不能聲明成無(wú)法繼承或重寫。者最終都是生成了一個(gè)新的動(dòng)態(tài)代理類對(duì)象。 動(dòng)態(tài)代理 1、先談靜態(tài)代理 對(duì)于靜態(tài)代理,我們已經(jīng)很熟悉了。我們擁有一個(gè)抽象類,真實(shí)類繼承自抽象類并重寫其業(yè)務(wù)方法,代理類持有真實(shí)類的對(duì)象實(shí)例,在重寫業(yè)務(wù)方法中通過(guò)調(diào)用真實(shí)...
Java的三種代理模式 參考:http://www.cnblogs.com/cenyu/...Java核心技術(shù)原書第九版6.5節(jié) 為什么使用代理 我們?cè)趯懸粋€(gè)功能函數(shù)時(shí),經(jīng)常需要在其中寫入與功能不是直接相關(guān)但很有必要的代 碼,如日志記錄,信息發(fā)送,安全和事務(wù)支持等,這些枝節(jié)性代碼雖然是必要的,但它會(huì)帶來(lái)以下麻煩: 枝節(jié)性代碼游離在功能性代碼之外,它不是函數(shù)的目的,這是對(duì)OO是一種破壞 枝節(jié)性...
閱讀 3477·2021-11-24 09:39
閱讀 1863·2021-11-17 09:33
閱讀 3814·2021-10-12 10:12
閱讀 5223·2021-09-22 15:51
閱讀 1166·2019-08-30 13:11
閱讀 3626·2019-08-30 10:59
閱讀 646·2019-08-30 10:48
閱讀 1375·2019-08-26 13:48