個(gè)人記錄-動(dòng)態(tài)代理

代理模式:

某一個(gè)對象提供一個(gè)代理對象居砖,并由代理對象控制對原對象的引用。

目的:
1驴娃、通過引入代理對象的方式來間接訪問目標(biāo)對象奏候,防止直接訪問目標(biāo)對象給系統(tǒng)帶來的不必要復(fù)雜性;
2唇敞、通過代理對象對訪問進(jìn)行控制蔗草;

代理模式.png

抽象角色:指代理角色和真實(shí)角色對外提供的公共方法,一般為一個(gè)接口疆柔。

真實(shí)角色:需要實(shí)現(xiàn)抽象角色接口咒精,定義了真實(shí)角色所要實(shí)現(xiàn)的業(yè)務(wù)邏輯,以便供代理角色調(diào)用旷档。也就是真正的業(yè)務(wù)邏輯在此狠轻。

代理角色:需要實(shí)現(xiàn)抽象角色接口,是真實(shí)角色的代理彬犯,通過真實(shí)角色的業(yè)務(wù)邏輯方法來實(shí)現(xiàn)抽象方法,并可以附加自己的操作查吊。將統(tǒng)一的流程控制都放到代理角色中處理谐区。

靜態(tài)代理:
靜態(tài)代理在使用時(shí),需要定義接口或者父類逻卖,被代理對象與代理對象一起實(shí)現(xiàn) 相同的接口或者是 繼承相同 父類宋列。一般來說,被代理對象和代理對象是一對一的關(guān)系评也,當(dāng)然一個(gè)代理對象對應(yīng)多個(gè)被代理對象也是可以的炼杖。
靜態(tài)代理灭返,一對一則會(huì)出現(xiàn)時(shí)靜態(tài)代理對象量多、代碼量大坤邪,從而導(dǎo)致代碼復(fù)雜熙含,可維護(hù)性差的問題,一對多則代理對象會(huì)出現(xiàn)擴(kuò)展能力差的問題艇纺。

動(dòng)態(tài)代理:
動(dòng)態(tài)代理是指客戶通過代理類來調(diào)用其它對象的方法怎静,并且是在程序運(yùn)行時(shí)根據(jù)需要?jiǎng)討B(tài)創(chuàng)建目標(biāo)類的代理對象。即不直接找到被代理對象黔衡,而是找被代理對象的經(jīng)紀(jì)人蚓聘,從而由經(jīng)紀(jì)人在找到被代理對象。代理對象較多的情況下盟劫,更適合使用動(dòng)態(tài)代理夜牡,降低代碼量和耦合度。

動(dòng)態(tài)代理實(shí)現(xiàn)如下:

    //抽象角色
    interface Api {
        void test(String a);
    }

    //真實(shí)角色
    static class ApiImpl implements Api {
        @Override
        public void test(String a) {
            System.out.println("api 實(shí)現(xiàn)內(nèi)容:" + a);
        }
    }

    public static void main(final String[] args) throws Exception {
        //真實(shí)角色實(shí)例
        final Api api = new ApiImpl();
        api.test("直接測試");

        /**
         * Proxy.newProxyInstance 創(chuàng)建了一個(gè)Class侣签,僅在內(nèi)存中生成
         * Object o             為代理對象,即Proxy.newProxyInstance 的返回值
         * Method method        為調(diào)用的方法
         * Object[] objects     為方法傳入的參數(shù)
         * InvocationHandler    是監(jiān)聽回調(diào)塘装,在代理對象上執(zhí)行方法,都會(huì)由這個(gè)監(jiān)聽回調(diào)出來
         */
        Object obj = Proxy.newProxyInstance(Api.class.getClassLoader(),
                new Class[]{Api.class},     //JDK實(shí)現(xiàn)只能 代理接口
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
                        for (Object obj : objects) {
                            System.out.println("傳參 " + obj);
                        }
                        //執(zhí)行真實(shí)對象方法
                        return method.invoke(api, objects);
                    }
                }
        );

        //真實(shí)角色實(shí)例
        Api api1 = (Api) obj;
        api1.test("動(dòng)態(tài)代理");

    }

得到結(jié)果

api 實(shí)現(xiàn)內(nèi)容:直接測試
動(dòng)態(tài)代理測試
api 實(shí)現(xiàn)內(nèi)容:動(dòng)態(tài)代理

靜態(tài)/動(dòng)態(tài) 代理區(qū)別如下:


代理區(qū)別.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末硝岗,一起剝皮案震驚了整個(gè)濱河市氢哮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌型檀,老刑警劉巖冗尤,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異胀溺,居然都是意外死亡裂七,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門仓坞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來背零,“玉大人,你說我怎么就攤上這事无埃♂闫浚” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵嫉称,是天一觀的道長侦镇。 經(jīng)常有香客問我,道長织阅,這世上最難降的妖魔是什么壳繁? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上闹炉,老公的妹妹穿的比我還像新娘蒿赢。我一直安慰自己,他們只是感情好渣触,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布羡棵。 她就那樣靜靜地躺著,像睡著了一般昵观。 火紅的嫁衣襯著肌膚如雪晾腔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天啊犬,我揣著相機(jī)與錄音灼擂,去河邊找鬼。 笑死觉至,一個(gè)胖子當(dāng)著我的面吹牛剔应,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播语御,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼峻贮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了应闯?” 一聲冷哼從身側(cè)響起纤控,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎碉纺,沒想到半個(gè)月后船万,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骨田,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年耿导,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片态贤。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舱呻,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悠汽,到底是詐尸還是另有隱情箱吕,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布柿冲,位于F島的核電站殖氏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏姻采。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望慨亲。 院中可真熱鬧婚瓜,春花似錦、人聲如沸刑棵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蛉签。三九已至胡陪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間碍舍,已是汗流浹背柠座。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留片橡,地道東北人妈经。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像捧书,于是被迫代替她去往敵國和親吹泡。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容