大話設計模式筆記(五)の代理模式

舉個栗子

故事是這樣的...

一個小夥子喜歡上了隔壁班的一個妹子,可是又不認識,也害羞很差意思主動去說話,因而拜託了一樣在這個班的一個朋友去傳遞本身想要送的禮物。。。web

代碼實現

該模式就不上什麼簡單實現了,直奔完整實現。安全

被追求者

/**
 * 被追求者
 * Created by callmeDevil on 2019/6/29.
 */
public class SchoolGirl {

    private String name;

    public SchoolGirl(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

想要送的禮物

/**
 * 送禮物
 * Created by callmeDevil on 2019/6/29.
 */
public interface GiveGift {

    /**
     * 送洋娃娃
     */
    void giveDolls();

    /**
     * 送鮮花
     */
    void giveFlowers();

    /**
     * 送巧克力
     */
    void giveChocolate();

}

追求者

/**
 * 追求者
 * Created by callmeDevil on 2019/6/29.
 */
public class Pursuit implements GiveGift {

    SchoolGirl mm;

    public Pursuit(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() + " 送你巧克力!");
    }

}

代替追求者的人

/**
 * 代替追求者的人
 * Created by callmeDevil on 2019/6/29.
 */
public class Proxy implements GiveGift {

    Pursuit gg;

    public Proxy(SchoolGirl mm) {
        // 禮物其實是追求者買來送的,這我的只是負責傳遞禮物
        this.gg = new Pursuit(mm);
    }

    @Override
    public void giveDolls() {
        gg.giveDolls();
    }

    @Override
    public void giveFlowers() {
        gg.giveFlowers();
    }

    @Override
    public void giveChocolate() {
        gg.giveChocolate();
    }

}

測試

/**
 * 代理模式測試
 * Created by callmeDevil on 2019/6/29.
 */
public class Test {

    public static void main(String[] args) {
        SchoolGirl jiaojiao = new SchoolGirl("李嬌嬌");
        Proxy proxy = new Proxy(jiaojiao);
        proxy.giveDolls();
        proxy.giveFlowers();
        proxy.giveChocolate();
    }

}

測試結果

李嬌嬌 送你洋娃娃!
李嬌嬌 送你鮮花!
李嬌嬌 送你巧克力!

代理模式

定義

爲其餘對象提供一種代理以控制對這個對象的訪問。ide

UML圖

代碼實現

參見上述栗子的代碼啦,此處再也不重複。測試

代理分類與應用

  • 遠程代理,也就是爲一個對象在不一樣的地址空間提供局部表明。這樣能夠隱藏一個對象存在於不一樣地址空間的事實。例如,在.NETweb項目中引用一個WebService時,會在項目中生成一個WebReference的文件夾和一些文件,其實它們就是代理,使得客戶端程序調用代理就能夠解決遠程訪問的問題。
  • 虛擬代理,是根據須要建立開銷很大的對象。經過它來存放實例化須要很長時間的真實對象。例如,打開一個很大的HTML網頁時,裏面可能含有不少的文字和圖片,但仍是能夠很快的打開,此時所看到的是全部的文字,但圖片是一張張下載後才能看到的,那些未打開的圖片框,就是經過虛擬代理來替代真實的圖片,存儲了真實圖片的路徑和尺寸。
  • 安全代理,用來控制真實對象訪問時的權限。通常應用於對象應該有不一樣的訪問權限的時候。
  • 智能指引,是指當調用真實的對象時,代理處理另一些事。例如,計算機的引用次數,這樣當該對象沒有引用時,能夠自動釋放它;或當第一次引用一個持久對象時,將它裝入內存;或在訪問一個實際對象時,檢查是否已經鎖定它,以確保其餘對象不能改變它。

總結

  • 代理模式其實就是在訪問對象時引入必定程度間接性,由於這種間接性,能夠附加多種用途。
  • 代理就是真實對象的表明。

故事結局...

是的,追求者與被追求者沒有結果,反卻是替代送禮物的人與被追求者認識並好上了。。。誰讓追求者不主動,不是活該是啥。。。ui

相關文章
相關標籤/搜索