代理模式

本文參考《Android源碼設計模式解析與實戰(zhàn)第2版》

  • 代理模式的定義

代理模式也稱為委托模式失暂,是為其他對象提供代理以控制這個對象的訪問暑始。

  • 代理模式的使用場景

無法或不想直接訪問某個對象户盯,或者訪問某個對象困難時可以通過代理對象來實現(xiàn)間接訪問玖院。

  • 代理模式的角色
  • Subject:抽象主題-聲明真實主題和代理的共同接口方法(事情執(zhí)行步驟)
  • RealSubject:真實主題類-該類表示所代理的真實對象(事情執(zhí)行步驟的具體實現(xiàn))
  • ProxySubject:代理類-該類持有真實主題類的引用芜辕,在其所實現(xiàn)的接口方法中調(diào)用真實主題類中相應的接口方法執(zhí)行涧偷,以實現(xiàn)代理的目的
  • Client:代理模式的執(zhí)行邏輯
  • 代理模式的簡單實現(xiàn)

使用代理模式實現(xiàn)一個訴訟過程簸喂,律師極為代理
定義訴訟流程(抽象主題-Subject)可以是接口也可以是抽象方法

/**
 * 抽象主題:
 * 定義訴訟的流程
 */

interface ILawsuit {
    /**
     * 提交申請
     */
    void submit();

    /**
     * 進行舉證
     */
    void burden();

    /**
     * 開始辯護
     */
    void defend();

    /**
     * 訴訟完成
     */
    void finish();
}

定義具體對象(真實主題類-RealSubject),即被代理對象

/**
 * 真實主題類:
 * 被代理的真實對象燎潮,執(zhí)行步驟的具體實現(xiàn)
 */

class XiaoMin implements ILawsuit {


    @Override
    public void submit() {
        System.out.println("申請仲裁喻鳄!");
    }

    @Override
    public void burden() {
        System.out.println("證據(jù)充足!");
    }

    @Override
    public void defend() {
        System.out.println("進行辯護确封!");
    }

    @Override
    public void finish() {
        System.out.println("訴訟成功除呵!");
    }
}

定義代理律師(代理類-ProxySubject)代理類中需要持有真實對象的實現(xiàn),并且實現(xiàn)訴訟流程接口

/**
 * 代理類
 * 通過持有的真實對象和實現(xiàn)事件流程接口來實現(xiàn)代理功能
 */

class Lawyer implements ILawsuit{

    private XiaoMin xiaoMin;//持有真實對象的引用

    public Lawyer(XiaoMin xiaoMin) {
        this.xiaoMin = xiaoMin;
    }

    @Override
    public void submit() {
        xiaoMin.submit();
    }

    @Override
    public void burden() {
        xiaoMin.burden();
    }

    @Override
    public void defend() {
        xiaoMin.defend();
    }

    @Override
    public void finish() {
        xiaoMin.finish();
    }
}

定義代理模式的執(zhí)行邏輯(具體執(zhí)行-Client)

class Client {

    public static void main(String[] args) {
        initStaticProxy();
    }
    /**
     * 靜態(tài)代理使用
     */
    private static void initStaticProxy(){
        //構建具體對象
        XiaoMin xiaoMin = new XiaoMin();
        //構造代理律師對象
        ILawsuit lawyer = new Lawyer(xiaoMin);

        //通過代理律師執(zhí)行具體訴訟邏輯
        lawyer.submit();
        lawyer.burden();
        lawyer.defend();
        lawyer.finish();
    }
}
  • 動態(tài)代理的實現(xiàn)

動態(tài)代理是通過實現(xiàn)InvocationHandler接口爪喘,反射調(diào)用被代理者方法颜曾,使得編譯階段不需要知道具體代理誰,運行時階段再確定代理誰秉剑,實現(xiàn)了代理類的復用泛豪。
動態(tài)代理類的具體實現(xiàn):

**
 * 動態(tài)代理的實現(xiàn)
 * 主要是實現(xiàn)InvocationHandler接口
 * 通過invoke方法反射調(diào)用具體對象(被代理的對象)的方法
 */

class DynamicProxy implements InvocationHandler {

    private Object obj;//被代理對象

    public DynamicProxy(Object obj) {
        this.obj = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //調(diào)用被代理對象的方法
        Object result = method.invoke(obj,args);
        return result;
    }
}

動態(tài)代理的具體使用:

class Client {
    public static void main(String[] args) {
        initDynamicProxy();
    }

    /**
     * 動態(tài)代理的使用
     */
    private static void initDynamicProxy(){
        //構造具體對象
        XiaoMin xiaoMin = new XiaoMin();

        //構造動態(tài)代理
        DynamicProxy dynamicProxy = new DynamicProxy(xiaoMin);

        //獲取被代理類的classLoader
        ClassLoader loader = xiaoMin.getClass().getClassLoader();

        //構造具體的代理律師
        ILawsuit lawyer = (ILawsuit) Proxy.newProxyInstance(loader,new Class[]{ILawsuit.class},dynamicProxy);
        //通過代理律師執(zhí)行具體訴訟邏輯
        lawyer.submit();
        lawyer.burden();
        lawyer.defend();
        lawyer.finish();
    }
}

靜態(tài)代理和動態(tài)代理的區(qū)別:
本質(zhì)區(qū)別:靜態(tài)代理的代理者一般由程序員手動實現(xiàn),也就是編譯階段class的的編譯文件就已經(jīng)存在侦鹏,動態(tài)代理是通過反射機制動態(tài)地生成代理者對象诡曙,所以
編譯階段根本不知道代理誰,到底代理誰是在運行時階段決定略水。
具體區(qū)別:
1.動態(tài)代理代理對象不明確价卤,可以復用,一個代理類可以代理多個被代理類
2.動態(tài)代理通過反射調(diào)用被代理對象方法聚请,需要實現(xiàn)InvocationHandler接口
總結:
不論是靜態(tài)代理還是動態(tài)代理只是實現(xiàn)手法不同荠雕,其思想都是一致的稳其,簡單說就是:
真實對象的所有事物耿戚,全權交給代理對象去處理胆剧。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嫉嘀,一起剝皮案震驚了整個濱河市穿铆,隨后出現(xiàn)的幾起案子奸腺,更是在濱河造成了極大的恐慌拧粪,老刑警劉巖淋肾,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媒抠,死亡現(xiàn)場離奇詭異五续,居然都是意外死亡洒敏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門疙驾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凶伙,“玉大人,你說我怎么就攤上這事它碎『伲” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵扳肛,是天一觀的道長傻挂。 經(jīng)常有香客問我,道長挖息,這世上最難降的妖魔是什么金拒? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮套腹,結果婚禮上绪抛,老公的妹妹穿的比我還像新娘。我一直安慰自己沉迹,他們只是感情好睦疫,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鞭呕,像睡著了一般蛤育。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上葫松,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天瓦糕,我揣著相機與錄音,去河邊找鬼腋么。 笑死咕娄,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的珊擂。 我是一名探鬼主播圣勒,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼费变,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了圣贸?” 一聲冷哼從身側(cè)響起挚歧,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吁峻,沒想到半個月后滑负,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡用含,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年矮慕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啄骇。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡痴鳄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缸夹,到底是詐尸還是另有隱情夏跷,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布明未,位于F島的核電站,受9級特大地震影響壹蔓,放射性物質(zhì)發(fā)生泄漏趟妥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一佣蓉、第九天 我趴在偏房一處隱蔽的房頂上張望披摄。 院中可真熱鬧,春花似錦勇凭、人聲如沸疚膊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寓盗。三九已至,卻和暖如春璧函,著一層夾襖步出監(jiān)牢的瞬間傀蚌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工蘸吓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留善炫,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓库继,卻偏偏與公主長得像箩艺,于是被迫代替她去往敵國和親窜醉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

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

  • 我是游戲至尊 2007年艺谆,感覺很無聊榨惰,于是就玩了一段時間的網(wǎng)絡游戲,游戲名就不說了擂涛,要不就有做廣告的嫌疑读串,反正就是...
    WILL_HUNTING閱讀 443評論 0 0
  • 一、概述 ??代理模式我們接觸的就比較多了撒妈,所謂的代理模式就是恢暖,給某一個對象提供一個代理對象,并由代理對象控制對原...
    騎著烏龜去看海閱讀 901評論 0 9
  • 目錄 本文的結構如下: 引言 什么是代理模式 模式的結構 典型代碼 代理模式分類 代碼示例 代理模式和裝飾者模式的...
    w1992wishes閱讀 1,534評論 0 13
  • 【學習難度:★★★☆☆狰右,使用頻率:★★★★☆】直接出處:代理模式梳理和學習:https://github.com/...
    BruceOuyang閱讀 1,728評論 0 1
  • 引言 在古代《三國志·諸葛亮傳》中有這么一句話——“政事無巨細咸于亮杰捂。”棋蚌;在唐代張九齡的《謝賜大麥面狀》中還有這么...
    CrazyMO_閱讀 378評論 0 0