代理模式

1.定義

代理模式是指為某個(gè)對(duì)象提供一個(gè)代理對(duì)象挤忙,來起到間接訪問的一個(gè)目的腥放,屬于結(jié)構(gòu)型設(shè)計(jì)模式比藻,在某種情況下郑象,一個(gè)對(duì)象不適合或者不能直接引用目標(biāo)對(duì)象贡这,代理對(duì)象在客戶端和目標(biāo)對(duì)象中間起到了一個(gè)中介的作用

2.靜態(tài)代理

靜態(tài)代理就是硬編碼,在編碼的過程中就已經(jīng)知道要代理的對(duì)象厂榛,最常見的就是controller盖矫、service、dao 就是靜態(tài)代理的一種實(shí)現(xiàn)击奶。

/**
 * create by yufeng on 2021/7/4 14:00
 */
public interface IPerson {

    void findLove();

}
/**
 * create by yufeng on 2021/7/4 14:00
 */
public class ZhangSan implements IPerson {

    public void findLove() {
        System.out.println("兒子要求:膚白貌美大長(zhǎng)腿");
    }

}
/**
 * create by yufeng on 2021/7/4 14:00
 */
public class ZhangLaosan implements IPerson {

    private ZhangSan zhangsan;

    public ZhangLaosan(ZhangSan zhangsan) {
        this.zhangsan = zhangsan;
    }

    public void findLove() {
        System.out.println("張老三開始物色");
        zhangsan.findLove();
        System.out.println("開始交往");
    }

}
/**
 * create by yufeng on 2021/7/4 14:00
 */
public class Test {
    public static void main(String[] args) {
        ZhangLaosan zhangLaosan = new ZhangLaosan(new ZhangSan());
        zhangLaosan.findLove();
    }
}
執(zhí)行結(jié)果:
  張老三開始物色
    兒子要求:膚白貌美大長(zhǎng)腿
    開始交往
3.動(dòng)態(tài)代理
3.1jdk動(dòng)態(tài)代理

靜態(tài)代理的弊端辈双,就是靜態(tài)代理只能手動(dòng)增加,如果代理類增加了新的方法柜砾,代理類也要同步增加辐马,違背了開閉原則

動(dòng)態(tài)代理在代碼允許的過程中動(dòng)態(tài)生成代碼的形式,取消了對(duì)被代理類的擴(kuò)展限制,遵循開閉原則喜爷。

/**
 * create by yufeng on 2021/7/4 14:33
 */
public interface IPerson {

    void findLove();

    void buyInsure();

}
/**
 * create by yufeng on 2021/7/4 14:33
 */
public class Zhangsan implements IPerson {

    public void findLove() {
        System.out.println("張三要求:膚白貌美大長(zhǎng)腿");
    }

    public void buyInsure() {
        System.out.println("30萬");
    }

}
/**
 * create by yufeng on 2021/7/4 14:33
 */
public class ZhaoLiu implements IPerson {

    public void findLove() {
        System.out.println("趙六要求:有車有房學(xué)歷高");
    }

    public void buyInsure() {

    }

}
/**
 * create by yufeng on 2021/7/4 14:33
 */
public class JdkMeipo implements InvocationHandler {
    private IPerson target;
    public IPerson getInstance(IPerson target){
        this.target = target;
        Class<?> clazz =  target.getClass();
        return (IPerson) Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);
    }

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        before();
        Object result = method.invoke(this.target,args);
        after();
        return result;
    }

    private void after() {
        System.out.println("雙方同意,開始交往");
    }

    private void before() {
        System.out.println("我是媒婆萄唇,已經(jīng)收集到你的需求檩帐,開始物色");
    }
}

/**
 * create by yufeng on 2021/7/4 14:33
 */
public class Test {
    public static void main(String[] args) {
        JdkMeipo jdkMeipo = new JdkMeipo();
        IPerson zhangsan = jdkMeipo.getInstance(new Zhangsan());
        zhangsan.findLove();
        zhangsan.buyInsure();


        IPerson zhaoliu = jdkMeipo.getInstance(new ZhaoLiu());
        zhaoliu.findLove();

    }
}
執(zhí)行結(jié)果:
  我是媒婆,已經(jīng)收集到你的需求另萤,開始物色
    張三要求:膚白貌美大長(zhǎng)腿
    雙方同意湃密,開始交往
    我是媒婆,已經(jīng)收集到你的需求四敞,開始物色
    30萬
    雙方同意泛源,開始交往
    我是媒婆,已經(jīng)收集到你的需求忿危,開始物色
    趙六要求:有車有房學(xué)歷高
    雙方同意达箍,開始交往

動(dòng)態(tài)生成代理類,后面如有王五要相親铺厨,是不需要改動(dòng)代理類的缎玫。

3.2cglib 動(dòng)態(tài)代理
/**
 * create by yufeng on 2021/7/4 14:33
 */
public class Customer {

    public void findLove(){
        System.out.println("兒子要求:膚白貌美大長(zhǎng)腿");
    }
}
/**
 * create by yufeng on 2021/7/4 15:33
 */
public class CGlibMeipo implements MethodInterceptor {


    public Object getInstance(Class<?> clazz) throws Exception{
        //相當(dāng)于Proxy,代理的工具類
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(clazz);
        enhancer.setCallback(this);
        return enhancer.create();
    }

    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        before();
        Object obj = methodProxy.invokeSuper(o,objects);
        after();
        return obj;
    }

    private void before(){
        System.out.println("我是媒婆解滓,我要給你找對(duì)象赃磨,現(xiàn)在已經(jīng)確認(rèn)你的需求");
        System.out.println("開始物色");
    }

    private void after(){
        System.out.println("OK的話,準(zhǔn)備辦事");
    }
}

/**
 * create by yufeng on 2021/7/4 14:33
 */
public class CglibTest {
    public static void main(String[] args) {

        try {
         
            Customer obj = (Customer) new CGlibMeipo().getInstance(Customer.class);
            System.out.println(obj);
            obj.findLove();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
3.3兩種動(dòng)態(tài)代理的區(qū)別

JDK是采用讀取接口的信息洼裤;CGLib覆蓋父類方法邻辉。目的都是動(dòng)態(tài)生成一個(gè)新的類,去實(shí)現(xiàn)增加代碼邏輯的功能腮鞍。

JDK對(duì)應(yīng)目標(biāo)類來說必須實(shí)現(xiàn)某個(gè)接口值骇;CGLib可以代理任意一個(gè)普通的類,沒有特殊要求缕减。

CGLib生成的代理邏輯更復(fù)雜雷客,效率調(diào)用效率更高,生成一個(gè)抱哈所有邏輯的FastClass桥狡,不需要反射

JDK Proxy生成代理的邏輯簡(jiǎn)單搅裙,執(zhí)行效率相對(duì)要低,每次都要反射動(dòng)態(tài)調(diào)用

但是CGLib 有需要注意的地方裹芝,CGLib不能代理final的方法

4源碼地址

代理模式源碼地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末部逮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嫂易,更是在濱河造成了極大的恐慌兄朋,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怜械,死亡現(xiàn)場(chǎng)離奇詭異颅和,居然都是意外死亡傅事,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門峡扩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蹭越,“玉大人,你說我怎么就攤上這事教届∠炀椋” “怎么了?”我有些...
    開封第一講書人閱讀 163,105評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵案训,是天一觀的道長(zhǎng)买置。 經(jīng)常有香客問我,道長(zhǎng)强霎,這世上最難降的妖魔是什么忿项? 我笑而不...
    開封第一講書人閱讀 58,242評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮脆栋,結(jié)果婚禮上倦卖,老公的妹妹穿的比我還像新娘。我一直安慰自己椿争,他們只是感情好怕膛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,269評(píng)論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秦踪,像睡著了一般褐捻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上椅邓,一...
    開封第一講書人閱讀 51,215評(píng)論 1 299
  • 那天柠逞,我揣著相機(jī)與錄音,去河邊找鬼景馁。 笑死板壮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的合住。 我是一名探鬼主播绰精,決...
    沈念sama閱讀 40,096評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼透葛!你這毒婦竟也來了笨使?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤僚害,失蹤者是張志新(化名)和其女友劉穎硫椰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,354評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡靶草,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,573評(píng)論 2 333
  • 正文 我和宋清朗相戀三年蹄胰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片爱致。...
    茶點(diǎn)故事閱讀 39,745評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡烤送,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出糠悯,到底是詐尸還是另有隱情,我是刑警寧澤妻往,帶...
    沈念sama閱讀 35,448評(píng)論 5 344
  • 正文 年R本政府宣布互艾,位于F島的核電站,受9級(jí)特大地震影響讯泣,放射性物質(zhì)發(fā)生泄漏纫普。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,048評(píng)論 3 327
  • 文/蒙蒙 一好渠、第九天 我趴在偏房一處隱蔽的房頂上張望昨稼。 院中可真熱鬧,春花似錦拳锚、人聲如沸假栓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匾荆。三九已至,卻和暖如春杆烁,著一層夾襖步出監(jiān)牢的瞬間牙丽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工兔魂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烤芦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,776評(píng)論 2 369
  • 正文 我出身青樓析校,卻偏偏與公主長(zhǎng)得像构罗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子勺良,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,652評(píng)論 2 354

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