設(shè)計(jì)模式之代理模式(Proxy)

1.代理模式的概念

為其他對(duì)象提供一種代理记舆,以控制對(duì)這個(gè)對(duì)象的訪問拨扶。

2.代理模式的結(jié)構(gòu)

這里寫圖片描述

Subject類:定義了RealSubject和Proxy的公共接口凳鬓,這樣就在任何使用RealSubject的地方都可以使用Proxy
RealSubject類:定義Proxy所代表的真實(shí)實(shí)體
Proxy類:保存一個(gè)引用使得代理可以訪問實(shí)體,并提供一個(gè)與Subject的接口相同的接口患民,這樣代理就可以用來代替實(shí)體缩举。

3.代理模式的基本代碼實(shí)現(xiàn)

Subject類:

package com.jxs.proxy;

/**
 * Created by jiangxs on 2018/5/3.
 *
 * Subject類,定義了RealSubject和Proxy的公共接口
 */
public abstract class Subject {

    public abstract void request();
}

RealSubject類:

package com.jxs.proxy;

/**
 * Created by jiangxs on 2018/5/3.
 *
 * RealSubject類匹颤,定義Proxy所代表的真實(shí)實(shí)體
 */
public class RealSubject extends Subject {

    @Override
    public void request() {
        System.out.println("真實(shí)的請(qǐng)求");
    }
}

Proxy類:

package com.jxs.proxy;

/**
 * Created by jiangxs on 2018/5/3.
 *
 * Proxy類仅孩,保存一個(gè)引用,使得代理可以訪問實(shí)體
 */
public class Proxy extends Subject {

    RealSubject realSubject;

    @Override
    public void request() {

        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        realSubject.request();
    }
}

客戶端代碼:

package com.jxs.proxy;

/**
 * Created by jiangxs on 2018/5/3.
 */
public class ProxyClient {

    public static void main(String[] args) {

        Proxy proxy = new Proxy();
        proxy.request();
    }
}

運(yùn)行結(jié)果:

真實(shí)的請(qǐng)求

Process finished with exit code 0

4.代理模式的應(yīng)用

以《大話設(shè)計(jì)模式》中卓賈易讓戴勵(lì)替他送禮物給嬌嬌印蓖,在這個(gè)例子當(dāng)中戴勵(lì)就起到了一個(gè)代理的作用辽慕,其中的GiveGift接口就相當(dāng)于Subject,作為Persuit類和ProxyPeople類的公共接口赦肃,Persuit類就相當(dāng)于RealSubject表示真實(shí)實(shí)體溅蛉,ProxyPeople類就相當(dāng)于Proxy類表示代理類。

這里寫圖片描述

卓賈易讓戴勵(lì)替他送禮物給嬌嬌代碼示例:

SchoolGirl類:

package com.jxs.proxyExample;

/**
 * Created by jiangxs on 2018/5/3.
 */
public class SchoolGirl {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

GiveGift接口(Subject):

package com.jxs.proxyExample;

/**
 * Created by jiangxs on 2018/5/3.
 *
 * 定義了Persuit和ProxyPeople的公共接口
 */
public interface GiveGift {

    void giveDolls();

    void giveFlowers();

    void giveChocolate();
}

Persuit類(RealSubject):

package com.jxs.proxyExample;

/**
 * Created by jiangxs on 2018/5/3.
 *
 * 相當(dāng)于代理模式中的RealSubject
 */
public class Persuit implements GiveGift {

    private SchoolGirl mm;

    public Persuit() {}

    public Persuit(SchoolGirl mm) {

        this.mm = mm;
    }

    @Override
    public void giveDolls() {

        System.out.println("送"+mm.getName()+"洋娃娃");
    }

    @Override
    public void giveFlowers() {

        System.out.println("送"+mm.getName()+"鮮花");
    }

    @Override
    public void giveChocolate() {

        System.out.println("送"+mm.getName()+"巧克力");
    }
}

ProxyPeople類(Proxy):

package com.jxs.proxyExample;

/**
 * Created by jiangxs on 2018/5/3.
 */
public class ProxyPeople implements GiveGift {

    private Persuit gg;

    public ProxyPeople() {}

    public ProxyPeople(SchoolGirl mm) {

        gg = new Persuit(mm);
    }

    @Override
    public void giveDolls() {

        gg.giveDolls();
    }

    @Override
    public void giveFlowers() {

        gg.giveFlowers();
    }

    @Override
    public void giveChocolate() {

        gg.giveChocolate();
    }
}

客戶端代碼:

package com.jxs.proxyExample;

/**
 * Created by jiangxs on 2018/5/3.
 */
public class Client {

    public static void main(String[] args) {

        SchoolGirl jiaojiao = new SchoolGirl();
        jiaojiao.setName("嬌嬌");

        ProxyPeople daili = new ProxyPeople(jiaojiao);

        daili.giveChocolate();
        daili.giveDolls();
        daili.giveFlowers();
    }
}

運(yùn)行結(jié)果:

送嬌嬌巧克力
送嬌嬌洋娃娃
送嬌嬌鮮花

Process finished with exit code 0

5.代理模式總結(jié)

代理模式適用場(chǎng)合:

遠(yuǎn)程代理:遠(yuǎn)程代理也就是為一個(gè)對(duì)象在不同的地址空間提供局部代表他宛。這樣可以隱藏一個(gè)對(duì)象存在于不同地址空間的事實(shí)温艇。比如引用WebService,此時(shí)就會(huì)在項(xiàng)目中生成一個(gè)WebReference的文件夾和一些文件堕汞,這些就是代理勺爱。
虛擬代理:所謂虛擬代理是根據(jù)需要?jiǎng)?chuàng)建開銷很大的對(duì)象,通過它來存放實(shí)例化需要很長時(shí)間的真實(shí)對(duì)象讯检,這樣就可以達(dá)到性能的最優(yōu)化琐鲁。
安全代理:用來控制真實(shí)對(duì)象訪問時(shí)的權(quán)限。一般用于對(duì)象應(yīng)該有不同的訪問權(quán)限的時(shí)候人灼。
智能指引 :是指當(dāng)調(diào)用真實(shí)的對(duì)象時(shí)围段,代理處理另外一些事。如計(jì)算真實(shí)對(duì)象的引用次數(shù)投放,這樣當(dāng)該對(duì)象沒有引用是奈泪,可以自動(dòng)釋放它。

注:以上代碼均可在github上進(jìn)行下載:https://github.com/xsongj/designPattern

參考:《大話設(shè)計(jì)模式》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涝桅,隨后出現(xiàn)的幾起案子拜姿,更是在濱河造成了極大的恐慌,老刑警劉巖冯遂,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蕊肥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛤肌,警方通過查閱死者的電腦和手機(jī)壁却,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裸准,“玉大人展东,你說我怎么就攤上這事〕淳悖” “怎么了盐肃?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長向胡。 經(jīng)常有香客問我恼蓬,道長惊完,這世上最難降的妖魔是什么僵芹? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮小槐,結(jié)果婚禮上拇派,老公的妹妹穿的比我還像新娘。我一直安慰自己凿跳,他們只是感情好件豌,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著控嗜,像睡著了一般茧彤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疆栏,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天曾掂,我揣著相機(jī)與錄音,去河邊找鬼壁顶。 笑死珠洗,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的若专。 我是一名探鬼主播许蓖,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了膊爪?” 一聲冷哼從身側(cè)響起自阱,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚁飒,沒想到半個(gè)月后动壤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淮逻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年琼懊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爬早。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哼丈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出筛严,到底是詐尸還是另有隱情醉旦,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布桨啃,位于F島的核電站车胡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏照瘾。R本人自食惡果不足惜匈棘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望析命。 院中可真熱鬧主卫,春花似錦、人聲如沸鹃愤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽软吐。三九已至瘩将,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凹耙,已是汗流浹背姿现。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留使兔,地道東北人建钥。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像虐沥,于是被迫代替她去往敵國和親熊经。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泽艘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348