摘要:什么是代理大道理上講代理是一種軟件設計模式,目的地希望能做到代碼重用。這個就好比商戶明星經(jīng)紀人代理明星這種模式。
(1)什么是代理?
大道理上講代理是一種軟件設計模式,目的地希望能做到代碼重用。具體上講,代理這種設計模式是通過不直接訪問被代理對象的方式,而訪問被代理對象的方法。這個就好比 商戶---->明星經(jīng)紀人(代理)---->明星這種模式。我們可以不通過直接與明星對話的情況下,而通過明星經(jīng)紀人(代理)與其產(chǎn)生間接對話
(2)什么情況下使用代理?
a. 設計模式中有一個設計原則是開閉原則,是說對修改關閉對擴展開放,我們在工作中有時會接手很多前人的代碼,里面代碼邏輯讓人摸不著頭腦(sometimes the code is really like shit),這時就很難去下手修改代碼,那么這時我們就可以通過代理對類進行增強。
b. 我們在使用RPC框架的時候,框架本身并不能提前知道各個業(yè)務方要調(diào)用哪些接口的哪些方法 。那么這個時候,就可用通過動態(tài)代理的方式來建立一個中間人給客戶端使用,也方便框架進行搭建邏輯,某種程度上也是客戶端代碼和框架松耦合的一種表現(xiàn)。
(3)靜態(tài)代理和動態(tài)代理
靜態(tài)代理比較簡單,主要是多態(tài)實現(xiàn),這里主要記錄下動態(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 { // 這個就是我們要代理的真實對象 private Object subject; // 構造方法,給我們要代理的真實對象賦初值 public DynamicProxy(Object subject) { this.subject = subject; } @Override public Object invoke(Object object, Method method, Object[] args) throws Throwable { // 在代理真實對象前我們可以添加一些自己的操作 System.out.println("before rent house"); System.out.println("Method:" + method); // 當代理對象調(diào)用真實對象的方法時,其會自動的跳轉到代理對象關聯(lián)的handler對象的invoke方法來進行調(diào)用 method.invoke(subject, args); // 在代理真實對象后我們也可以添加一些自己的操作 System.out.println("after rent house"); return null; } }
測試類
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){ //代理對象 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"); } }
測試結果:
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
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71562.html
摘要:動態(tài)代理又被稱為代理或接口代理。靜態(tài)代理在編譯時產(chǎn)生字節(jié)碼文件,可以直接使用,效率高。代理無需實現(xiàn)接口,通過生成類字節(jié)碼實現(xiàn)代理,比反射稍快,不存在性能問題,但會繼承目標對象,需要重寫方法,所以目標對象不能為類。 一、代理模式介紹 代理模式是一種設計模式,提供了對目標對象額外的訪問方式,即通過代理對象訪問目標對象,這樣可以在不修改原目標對象的前提下,提供額外的功能操作,擴展目標對象的功...
摘要:除了和外,我們還有最后一招我直接把一個代理類的源代碼用字符串拼出來,然后基于這個字符串調(diào)用的編譯期,動態(tài)的創(chuàng)建一個新的文件,然后動態(tài)編譯這個文件,這樣也能得到一個新的代理類。 面試問題:Java里的代理設計模式(Proxy Design Pattern)一共有幾種實現(xiàn)方式?這個題目很像孔乙己問茴香豆的茴字有哪幾種寫法? showImg(https://segmentfault.com/...
摘要:代理模式基本概念不論是靜態(tài)代理還是動態(tài)代理其本質(zhì)都是代理模式的一種實現(xiàn)那么什么是代理模式呢代理模式即給某一個對象提供一個代理并由代理對象控制對原對象的引用代理模式其實取材于實際生活例如我們生活中常見的房屋租賃代理我們在租房時一般不是直接和房 代理模式 基本概念 不論是靜態(tài)代理還是動態(tài)代理, 其本質(zhì)都是代理模式的一種實現(xiàn), 那么什么是代理模式呢?代理模式, 即給某一個對象提供一個代理, ...
摘要:動態(tài)代理的產(chǎn)生就是這樣而來的。在的方案中我們只需要這樣做可以實現(xiàn)動態(tài)代理了。委托類實際執(zhí)行類利用提供的實現(xiàn)動態(tài)代理代理環(huán)繞執(zhí)行實際的方法利用的實現(xiàn)代理動態(tài)代理,有幾個關鍵點,一個就是接口,這個方法中的方法是執(zhí)行代理時會執(zhí)行的方法。 什么是代理? 代理是一種設計模式,簡單的說就是為某個對象提供代理,以控制這個對象的訪問,在不修改原方法的情況下做方法增強,簡單的可以分為兩種: 靜態(tài)代理 ...
摘要:要明白,動態(tài)代理類的存在意義是為了攔截方法并修改邏輯而動態(tài)代理的局限性之一就是只能攔截接口所聲明的方法。因為動態(tài)代理類是繼承自業(yè)務類,所以該類和方法不能聲明成無法繼承或重寫。者最終都是生成了一個新的動態(tài)代理類對象。 動態(tài)代理 1、先談靜態(tài)代理 對于靜態(tài)代理,我們已經(jīng)很熟悉了。我們擁有一個抽象類,真實類繼承自抽象類并重寫其業(yè)務方法,代理類持有真實類的對象實例,在重寫業(yè)務方法中通過調(diào)用真實...
Java的三種代理模式 參考:http://www.cnblogs.com/cenyu/...Java核心技術原書第九版6.5節(jié) 為什么使用代理 我們在寫一個功能函數(shù)時,經(jīng)常需要在其中寫入與功能不是直接相關但很有必要的代 碼,如日志記錄,信息發(fā)送,安全和事務支持等,這些枝節(jié)性代碼雖然是必要的,但它會帶來以下麻煩: 枝節(jié)性代碼游離在功能性代碼之外,它不是函數(shù)的目的,這是對OO是一種破壞 枝節(jié)性...
閱讀 3406·2021-11-24 09:39
閱讀 1797·2021-11-17 09:33
閱讀 3503·2021-10-12 10:12
閱讀 5019·2021-09-22 15:51
閱讀 1112·2019-08-30 13:11
閱讀 3572·2019-08-30 10:59
閱讀 564·2019-08-30 10:48
閱讀 1311·2019-08-26 13:48