您的設計模式——代理模式【Proxy Pattern 】

什麼是代理模式呢?我很忙,忙的沒空理你,那你要找我呢就先找我的代理人吧,那代理人總要知道

被代理人能做哪些事情不能做哪些事情吧,那就是兩個人具備同一個接口,代理人雖然不能幹活,但是被
代理的人能幹活呀。
比如西門慶找潘金蓮,那潘金蓮不好意思答覆呀,咋辦,找那個王婆做代理,表現在程序上時這樣的:
先定義一種類型的女人:

package com.alex.patterns.proxy;

/**
 * @author Alex 
 * 定義一種類型的女人,王婆和潘金蓮都屬於這個類型的女人
 */
public interface KindWomen {
    // 這種類型的女人能做什麼事情呢?
    public void makeEyesWithMan(); // 拋媚眼

    public void happyWithMan(); // happy what? You know that!
}

一種類型嘛,那肯定是接口,然後定義潘金蓮:

package com.alex.patterns.proxy;

/**
 * @author Alex
 *  定一個潘金蓮是什麼樣的人
 */
public class PanJinLian implements KindWomen {
    public void happyWithMan() {
        System.out.println("潘金蓮在和男人做那個.....");
    }

    public void makeEyesWithMan() {
        System.out.println("潘金蓮拋媚眼");
    }
}

再定一個醜陋的王婆:

package com.alex.patterns.proxy;

/**
 * @author Alex
 * 王婆這個人老聰明瞭,她太老了,是個男人都看不上, 但是她有智慧有經驗呀,她作爲一類女人的代理!
 */
public class WangPo implements KindWomen {
    private KindWomen kindWomen;

    public WangPo() { // 默認的話,是潘金蓮的代理
        this.kindWomen = new PanJinLian();
    }

    // 她可以是KindWomen的任何一個女人的代理,只要你是這一類型
    public WangPo(KindWomen kindWomen) {
        this.kindWomen = kindWomen;
    }

    public void happyWithMan() {
        this.kindWomen.happyWithMan(); // 自己老了,幹不了,可以讓年輕的代替
    }

    public void makeEyesWithMan() {
        this.kindWomen.makeEyesWithMan(); // 王婆這麼大年齡了,誰看她拋媚眼?!
    }
}

兩個女主角都上場了,男主角也該出現了:

package com.alex.patterns.proxy;

/**
 * @author Alex
 * 定義一個西門慶,這人色中餓鬼
 */
public class XiMenQing {
    /*
     * 水滸裏是這樣寫的:西門慶被潘金蓮用竹竿敲了一下難道,癡迷了, 被王婆看到了, 就開始撮合兩人好事,王婆作爲潘金蓮的代理人
     * 收了不少好處費,那我們假設一下: 如果沒有王婆在中間牽線,這兩個不要臉的能成嗎?難說的很!
     */
    public static void main(String[] args) {
        // 把王婆叫出來
        WangPo wangPo = new WangPo();
        // 然後西門慶就說,我要和潘金蓮happy,然後王婆就安排了西門慶丟筷子的那齣戲:
        wangPo.makeEyesWithMan(); // 看到沒,雖然表面上時王婆在做,實際上爽的是潘金蓮
        wangPo.happyWithMan();
    }
}

那這就是活生生的一個例子,通過代理人實現了某種目的,如果真去掉王婆這個中間環節,直接是西
門慶和潘金蓮勾搭,估計很難成就武松殺嫂事件。
那我們再考慮一下,水滸裏還有沒有這類型的女人?有,盧俊義的老婆賈氏(就是和那個固管家苟合
的那個) ,這名字起的: “假使” ,那我們也讓王婆做她的代理:
把賈氏素描出來:

package com.alex.patterns.proxy;

/**
 * @author Alex
 */
public class JiaShi implements KindWomen {
    public void happyWithMan() {
        System.out.println("賈氏正在Happy中......");
    }

    public void makeEyesWithMan() {
        System.out.println("賈氏拋媚眼");
    }
}

西門慶勾賈氏:

package com.alex.patterns.proxy;

/**
 * @author Alex
 * 定義一個西門慶,這人色中餓鬼
 */
public class XiMenQing {
    public static void main(String[] args) {
        // 改編一下歷史,賈氏被西門慶勾走:
        JiaShi jiaShi = new JiaShi();
        WangPo wangPo = new WangPo(jiaShi); // 讓王婆作爲賈氏的代理人
        wangPo.makeEyesWithMan();
        wangPo.happyWithMan();
    }
}

說完這個故事,那額總結一下,代理模式主要使用了 Java 的多態,幹活的是被代理類,代理類主要是
接活,你讓我幹活,好,我交給幕後的類去幹,你滿意就成,那怎麼知道被代理類能不能幹呢?同根就成,
大家知根知底,你能做啥,我能做啥都清楚的很,同一個接口唄。

注:本文參考PDF《您的設計模式》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章