生活中的代理模式

代理模式

什么是代理模式?

代理模式的定義:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問闰靴。在某些情況下,一個(gè)對(duì)象不適合或者不能直接引用另一個(gè)對(duì)象,而代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到中介的作用。
通俗的的理解:我們?cè)谧夥孔拥臅r(shí)候回去找中介加矛,為什么呢?因?yàn)槟銓?duì)該地區(qū)房屋的信息掌握的
不夠全面煤篙,希望找一個(gè)更熟悉的人去幫你做斟览,此處的代理就是這個(gè)意思。再如我們有的時(shí)候打
官司辑奈, 我們需要請(qǐng)律師苛茂, 因?yàn)槁蓭熢诜煞矫嬗袑iL(zhǎng), 可以替我們進(jìn)行操作鸠窗, 表達(dá)我們的想法妓羊。

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

代理模式.png

從上圖我們清楚的可以看出:

  1. 代理類委托類分別實(shí)現(xiàn)了接口
  2. 代理類依賴委托類(說白了就是持有委托類的引用)

代理模式的實(shí)現(xiàn)

為加深印象,下面將以故事的形式將代理模式展現(xiàn)出來.先交代一下背景,有一天,小明同學(xué)(無(wú)辜的小明)想買i7的cpu,但是害怕被宰,所以找到了我(萬(wàn)能的我),讓我?guī)兔θビ憙r(jià)還價(jià).他給了我最高的價(jià)格1500rmb.
下面我們分四步進(jìn)行實(shí)現(xiàn).

  1. 編寫接口
    我們先編寫一個(gè)消費(fèi)者的接口
/**
 * 消費(fèi)者
 */
public interface Consumer {
    /**
     * 購(gòu)物
     * @param product 商品
     * @param minPrice 賣家給出的最低價(jià)格
     */
    boolean shop(String product,int minPrice);
}
  1. 編寫委托類
    其次我們?cè)倬帉慞erson類去實(shí)現(xiàn)消費(fèi)者接口
public class Person implements Consumer {
    private String name;
    /**商品*/
    private String product;
    /**能接受的最高價(jià)格*/
    private int maxPrice;

    public Person(String name, String product, int maxPrice) {
        this.name = name;
        this.product = product;
        this.maxPrice = maxPrice;
    }

    public String getName() {
        return name;
    }

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

    public String getProduct() {
        return product;
    }

    public void setProduct(String product) {
        this.product = product;
    }

    public void setMaxPrice(int maxPrice) {
        this.maxPrice = maxPrice;
    }

    public int getMaxPrice() {
        return maxPrice;
    }

    @Override
    public boolean shop(String product, int minPrice) {
        if (minPrice<=maxPrice){//賣家給出的最低價(jià)格小于能承受的價(jià)格
            System.out.println(name +"花了"+minPrice+"購(gòu)買了" + product);
            return true;
        }

        return false;
    }
}
  1. 編寫代理類
    最后們?cè)倬帉懘眍?這也是代理模式的核心,前方高能,大家要坐穩(wěn)了
public class PersonProxy implements Consumer {

    private Person person;
    /**談判次數(shù)*/
    private int bargainingNum=0;
    /**討價(jià)還價(jià)后的價(jià)格*/
    private int bargainingPrice = 0;
    private String name;

    public PersonProxy(Person person, String name) {
        this.person = person;
        this.name = name;
    }

    @Override
    public boolean shop(String product, int minPrice) {
       if (minPrice<=bargaining(minPrice)){
           //如果給出的價(jià)格小于等于討價(jià)還價(jià)后的價(jià)格就成交
           person.shop(product,minPrice);
           System.out.println("討價(jià)還價(jià)了"+bargainingNum+"次,"+person.getName() + "和" + name + "開心的走了");
           return true;
       }

        return false;
    }

    /**
     * 討價(jià)還價(jià)
     * @param minPrice
     */
    private int bargaining(int minPrice) {

        switch (bargainingNum) {
            case 0:
               if ( minPrice<person.getMaxPrice()-500){
                   System.out.println("價(jià)格合理,成交");
               }else {
                    System.out.println(minPrice+",太貴了請(qǐng)?jiān)诮o出合理的價(jià)格");
               }
                bargainingPrice=person.getMaxPrice()-500;
                break;
            case 1:
                if ( minPrice<person.getMaxPrice()-300){
                    System.out.println("價(jià)格合理,成交");

                }else {
                     System.out.println(minPrice+",太貴了請(qǐng)?jiān)诮o出合理的價(jià)格");
                }
                bargainingPrice=person.getMaxPrice()-300;
                break;

            case 2:
                if ( minPrice<person.getMaxPrice()-200){
                    System.out.println("價(jià)格合理,成交");

                }else {
                     System.out.println(minPrice+",太貴了請(qǐng)?jiān)诮o出合理的價(jià)格");
                }
                bargainingPrice=person.getMaxPrice()-200;
                break;
            case 3:
                if ( minPrice<=person.getMaxPrice()){
                    System.out.println("價(jià)格合理,成交");
                    bargainingPrice=minPrice;
                }else {
                    System.out.println("不買了!");
                }
                break;
        }

        bargainingNum++;
        return bargainingPrice;
    }
}

4.開始測(cè)試

public class Test {
    public static void main(String[] args) {
        Collection collection=new MyCollection();
        Iterator iterator=new MyIterator(collection);

        while (iterator.hasNext()) {
            System.out.print(iterator.next()+" ");
        }
    }
}

測(cè)試結(jié)果:

1700,太貴了請(qǐng)?jiān)诮o出合理的價(jià)格
1600,太貴了請(qǐng)?jiān)诮o出合理的價(jià)格
1500,太貴了請(qǐng)?jiān)诮o出合理的價(jià)格
價(jià)格合理,成交
小明花了1400購(gòu)買了i7cup
討價(jià)還價(jià)了4次,小明和會(huì)理發(fā)的店小二開心的走了

結(jié)語(yǔ):

寫個(gè)屁代碼.jpg

開個(gè)玩笑,俗話說的好,萬(wàn)變不離其宗,這里兩點(diǎn)要切記,這也是代理模式的核心:

  1. 代理類和委托類要分別實(shí)現(xiàn)共同接口.
  2. 代理類要持有委托類的引用.
  3. 代理類實(shí)現(xiàn)接口方法里要調(diào)用委托類實(shí)現(xiàn)的方法(可以在調(diào)用委托類方法前和后編寫代理類自己的邏輯).
    另外本人對(duì)扯蛋有獨(dú)到見解,歡迎前來本人博客扯蛋,我有酒,就差你的故事了
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市稍计,隨后出現(xiàn)的幾起案子躁绸,更是在濱河造成了極大的恐慌,老刑警劉巖臣嚣,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件净刮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡硅则,警方通過查閱死者的電腦和手機(jī)淹父,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怎虫,“玉大人弹灭,你說我怎么就攤上這事督暂。” “怎么了穷吮?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)饥努。 經(jīng)常有香客問我捡鱼,道長(zhǎng),這世上最難降的妖魔是什么酷愧? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任驾诈,我火速辦了婚禮,結(jié)果婚禮上溶浴,老公的妹妹穿的比我還像新娘乍迄。我一直安慰自己,他們只是感情好士败,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布闯两。 她就那樣靜靜地躺著,像睡著了一般谅将。 火紅的嫁衣襯著肌膚如雪漾狼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天饥臂,我揣著相機(jī)與錄音逊躁,去河邊找鬼。 笑死隅熙,一個(gè)胖子當(dāng)著我的面吹牛稽煤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播囚戚,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼酵熙,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了弯淘?” 一聲冷哼從身側(cè)響起绿店,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎庐橙,沒想到半個(gè)月后假勿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡态鳖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年转培,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浆竭。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浸须,死狀恐怖惨寿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情删窒,我是刑警寧澤裂垦,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站肌索,受9級(jí)特大地震影響蕉拢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诚亚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一晕换、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧站宗,春花似錦闸准、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至或辖,卻和暖如春瘾英,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背颂暇。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工缺谴, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耳鸯。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓湿蛔,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親县爬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子阳啥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)财喳,斷路器察迟,智...
    卡卡羅2017閱讀 134,629評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法耳高,內(nèi)部類的語(yǔ)法扎瓶,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法泌枪,線程的語(yǔ)...
    子非魚_t_閱讀 31,598評(píng)論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,805評(píng)論 0 11
  • 1 場(chǎng)景問題# 1.1 訪問多條數(shù)據(jù)## 考慮這樣一個(gè)實(shí)際應(yīng)用:要一次性訪問多條數(shù)據(jù)概荷。 這個(gè)功能的背景是這樣的;在...
    七寸知架構(gòu)閱讀 2,983評(píng)論 1 52
  • 簡(jiǎn)悅直播教練恬源閱讀 116評(píng)論 2 0