代理模式

為某對象提供一種代理以控制對該對象的訪問阳似。即客戶端通過代理間接地訪問該對象叨粘,從而限制晤揣、增強或修改該對象的一些特性屋确。

  • 靜態(tài)代理:需要定義接口或者父類纳击,被代理對象與代理對象一起實現(xiàn)相同的接口或者繼承相同父類
  • 動態(tài)代理:
    • JDK代理:代理接口;
    • Cglib代理:不需要接口乍恐,而是創(chuàng)建子類

1评疗、靜態(tài)代理

package com.strife.pattern.proxy;

/**
 * 代理模式:靜態(tài)代理
 *
 * @author mengzhenghao
 * @date 2022/6/1
 */
public class StaticProxy {

    public static void main(String[] args) {
        //目標對象
        TeacherDao teacherDao = new TeacherDao();
        //通過代理對象調用被代理對象的方法
        new TeacherDaoProxy(teacherDao).teach();
    }
}

interface ITeacherDao {

    void teach();
}

class TeacherDao implements ITeacherDao {

    @Override
    public void teach() {
        System.out.println("teach方法被調用……");
    }
}

class TeacherDaoProxy implements ITeacherDao {

    private TeacherDao traget;

    public TeacherDaoProxy(TeacherDao traget) {
        this.traget = traget;
    }

    @Override
    public void teach() {
        System.out.println("teach()方法執(zhí)行之前");
        traget.teach();
        System.out.println("teach()方法執(zhí)行之后");
    }
}

2、JDK動態(tài)代理

package com.strife.pattern.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 代理模式:JDK動態(tài)代理
 *
 * @author mengzhenghao
 * @date 2022/6/1
 */
public class JdkProxy {

    public static void main(String[] args) {
        StudentDao studentDao = new StudentDao();
        ProxyFactory factory = new ProxyFactory(studentDao);
        IStudentDao proxyObject = (IStudentDao) factory.getProxyInstance();
        //class com.strife.pattern.proxy.$Proxy0 內存中動態(tài)生成了代理對象
        System.out.println(proxyObject.getClass());
        proxyObject.study();
    }
}

interface IStudentDao {

    void study();
}

class StudentDao implements IStudentDao {

    @Override
    public void study() {
        System.out.println("studying……");
    }
}

class ProxyFactory {

    private StudentDao target;

    public ProxyFactory(StudentDao target) {
        this.target = target;
    }

    /** 獲取代理對象 */
    public Object getProxyInstance() {
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("JDK代理開始");
                return method.invoke(target, args);
            }
        });
    }
}

3茵烈、Cglib動態(tài)代理

package com.strife.pattern.proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * 代理對象:Cglib動態(tài)代理
 *
 * @author mengzhenghao
 * @date 2022/6/1
 */
public class CglibProxy {

    public static void main(String[] args) {
        People people = new People();
        final People peopleProxy = (People) new PeopleProxyFactory(people).getProxyInstance();
        System.out.println(peopleProxy.walk());
    }
}

class People {

    String walk() {
        System.out.println("walking……");
        return "OK";
    }
}

class PeopleProxyFactory implements MethodInterceptor {

    private Object target;

    public PeopleProxyFactory(Object target) {
        this.target = target;
    }

    /** 返回代理對象 */
    public Object getProxyInstance() {
        //創(chuàng)建工具類
        final Enhancer enhancer = new Enhancer();
        //設置父類
        enhancer.setSuperclass(target.getClass());
        //設置回調函數(shù)
        enhancer.setCallback(this);
        //創(chuàng)建代理對象
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("Cglib代理模式開始");
        return method.invoke(target, args);
    }
}

<!--Cglib依賴-->
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.1</version>
</dependency>
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末百匆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子呜投,更是在濱河造成了極大的恐慌加匈,老刑警劉巖存璃,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雕拼,居然都是意外死亡纵东,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門啥寇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來偎球,“玉大人,你說我怎么就攤上這事辑甜∷バ酰” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵磷醋,是天一觀的道長猫牡。 經常有香客問我,道長邓线,這世上最難降的妖魔是什么淌友? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮骇陈,結果婚禮上震庭,老公的妹妹穿的比我還像新娘。我一直安慰自己缩歪,他們只是感情好归薛,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布谍憔。 她就那樣靜靜地躺著匪蝙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪习贫。 梳的紋絲不亂的頭發(fā)上逛球,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音苫昌,去河邊找鬼颤绕。 笑死,一個胖子當著我的面吹牛祟身,可吹牛的內容都是我干的奥务。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼袜硫,長吁一口氣:“原來是場噩夢啊……” “哼氯葬!你這毒婦竟也來了?” 一聲冷哼從身側響起婉陷,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤帚称,失蹤者是張志新(化名)和其女友劉穎官研,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闯睹,經...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡戏羽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了楼吃。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片始花。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖孩锡,靈堂內的尸體忽然破棺而出衙荐,到底是詐尸還是另有隱情,我是刑警寧澤浮创,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布忧吟,位于F島的核電站,受9級特大地震影響斩披,放射性物質發(fā)生泄漏溜族。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一垦沉、第九天 我趴在偏房一處隱蔽的房頂上張望煌抒。 院中可真熱鬧,春花似錦厕倍、人聲如沸寡壮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽况既。三九已至,卻和暖如春组民,著一層夾襖步出監(jiān)牢的瞬間棒仍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工臭胜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留莫其,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓耸三,卻偏偏與公主長得像乱陡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子仪壮,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內容