日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

詳解JAVA設(shè)計(jì)模式之代理模式

瀏覽:156日期:2022-08-30 17:08:29

什么是設(shè)計(jì)模式(Design Pattern)?

設(shè)計(jì)模式是一套被反復(fù)使用,多數(shù)人知曉的,經(jīng)過(guò)分類編目的,代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。

代理模式的定義?

代理模式就是為其他對(duì)象提供一種代理,以控制對(duì)這個(gè)對(duì)象的訪問(wèn)。

代理對(duì)象起到中介作用,可去掉功能服務(wù)或增加額外的服務(wù)。

代理對(duì)象和目標(biāo)對(duì)象的關(guān)系?

代理對(duì)象:增強(qiáng)后的對(duì)象

目標(biāo)對(duì)象:被增強(qiáng)的對(duì)象

他們不是絕對(duì)的,會(huì)根據(jù)情況發(fā)生變化。

代理模式的兩種實(shí)現(xiàn)方式?

1.靜態(tài)代理:代理和被代理對(duì)象在代理之前是確定的,它們都實(shí)現(xiàn)相同的接口或者繼承相同的抽象類。

2.動(dòng)態(tài)代理:JDK通過(guò)接口反射得到字節(jié)碼,然后把字節(jié)碼轉(zhuǎn)換成class(通過(guò)native方法)

靜態(tài)代理實(shí)現(xiàn)的兩種方式?

使用繼承方式實(shí)現(xiàn)和使用聚合方式實(shí)現(xiàn)。

繼承:代理對(duì)象繼承目標(biāo)對(duì)象,重寫(xiě)需要增強(qiáng)的方法。缺點(diǎn):代理類過(guò)多,產(chǎn)生類爆炸。

聚合:目標(biāo)對(duì)象和代理對(duì)象實(shí)現(xiàn)同一個(gè)接口,代理對(duì)象當(dāng)中要包含目標(biāo)對(duì)象。

動(dòng)態(tài)代理的實(shí)現(xiàn)方式?

Java動(dòng)態(tài)代理類位于java.lang.reflect包下,一般主要涉及到以下兩個(gè)類:

1.Interface InvocationHandler : 該接口中僅定義了一個(gè)方法,public Object invoke(Object obj,Method method,Object[] args),在實(shí)際使用時(shí),第一個(gè)參數(shù)obj一般是指代理類,method是被代理的方法,args是該方法的參數(shù)數(shù)組,這個(gè)抽象方法在代理類中動(dòng)態(tài)實(shí)現(xiàn)。

2.Proxy 該類即為動(dòng)態(tài)代理類,static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h):返回代理類的一個(gè)實(shí)例,返回后的代理類可以當(dāng)做被代理類使用(可使用被代理類在接口中聲明過(guò)的方法)

所謂的動(dòng)態(tài)代理是這樣一種class:它是在運(yùn)行時(shí)生成的class,該class需要實(shí)現(xiàn)一組interface,使用動(dòng)態(tài)代理類時(shí),必須實(shí)現(xiàn)InvocationHandler接口。

JDK動(dòng)態(tài)代理和CGLIB動(dòng)態(tài)代理的區(qū)別?

1.JDK動(dòng)態(tài)代理只能代理實(shí)現(xiàn)了接口的類,沒(méi)有實(shí)現(xiàn)接口的類不能實(shí)現(xiàn)JDK的動(dòng)態(tài)代理。

2.CGLIB動(dòng)態(tài)代理針對(duì)類來(lái)實(shí)現(xiàn)代理的,對(duì)指定目標(biāo)類產(chǎn)生一個(gè)子類,通過(guò)方法攔截技術(shù)攔截所有的父類方法的調(diào)用。

動(dòng)態(tài)代理實(shí)現(xiàn)的思路:

1.聲明一段源碼(動(dòng)態(tài)產(chǎn)生代理)

2.編譯源碼(JDK Compiler API ),產(chǎn)生新的類(代理類)

3.將這個(gè)類load到內(nèi)存中,產(chǎn)生一個(gè)新的對(duì)象(代理對(duì)象)

4.return 代理對(duì)象。

使用靜態(tài)代理的例子:

1.首先創(chuàng)建業(yè)務(wù)邏輯接口

/** * 接口 * @author Administrator * */public interface Moveable { /** * * 接口中的方法 * @Description: TODO * @returnType: void */ void move();}

2.創(chuàng)建實(shí)現(xiàn)類,實(shí)現(xiàn)接口中的方法

/** * 實(shí)現(xiàn)類 * @author Administrator * */public class Car implements Moveable { @Override public void move() { //實(shí)現(xiàn)開(kāi)車 try { Thread.sleep(new Random().nextInt(1000)); System.out.println('汽車行駛中...'); } catch (InterruptedException e) { e.printStackTrace(); } }}

3.使用繼承方式實(shí)現(xiàn)對(duì)實(shí)現(xiàn)類的代理

/** * 使用繼承方式實(shí)現(xiàn)代理 * @author Administrator * */public class Car2 extends Car { /* (non-Javadoc) * @see com.wk.design.proxy.Car#move() * 直接調(diào)用父類的move方法,這樣就形成了一個(gè)Car2對(duì)Car的代理 */ @Override public void move() { long startTime = System.currentTimeMillis(); System.out.println('汽車開(kāi)始行駛...'); //使用繼承的方式調(diào)用父類的move()方法 super.move(); long endTime = System.currentTimeMillis(); System.out.println('汽車行駛結(jié)束... 汽車行駛時(shí)間:'+(endTime-startTime)+'毫秒。'); }}

4.創(chuàng)建測(cè)試類

/** * 測(cè)試類 * @author Administrator * */public class Test { public static void main(String[] args) {// Car car = new Car();// car.move(); //使用繼承方式實(shí)現(xiàn)代理 Moveable car2 = new Car2(); car2.move(); //使用聚合方式實(shí)現(xiàn)代理// Car car = new Car();// Moveable car3 = new Car3(car);// car3.move(); }}

5.使用聚合方式實(shí)現(xiàn)對(duì)實(shí)現(xiàn)類的代理

日志代理類

/** * * 日志代理類 * @author Administrator * */public class CarLogProxy implements Moveable { /** * 使用接口聲明代理類 */ private Moveable m; /** * 通過(guò)構(gòu)造方法的參數(shù)傳入代理類 * @param m */ public CarLogProxy(Moveable m) { super(); this.m = m; } @Override public void move() { System.out.println('日志開(kāi)始'); //調(diào)用代理類的方法 m.move(); System.out.println('日志結(jié)束'); }}

時(shí)間代理類

/** * 時(shí)間代理類 * @author Administrator * */public class CarTimeProxy implements Moveable { /** * 使用接口聲明代理類 */ private Moveable m; /** * 通過(guò)構(gòu)造方法的參數(shù)傳入代理類 * @param m */ public CarTimeProxy(Moveable m) { super(); this.m = m; } @Override public void move() { long startTime = System.currentTimeMillis(); System.out.println('汽車開(kāi)始行駛...'); //調(diào)用代理類的方法 m.move(); long endTime = System.currentTimeMillis(); System.out.println('汽車行駛結(jié)束... 汽車行駛時(shí)間:'+(endTime-startTime)+'毫秒。'); }}

6.創(chuàng)建聚合方式測(cè)試類

/** * 聚合代理測(cè)試類 * @author Administrator * */public class TestJuHeProxy { public static void main(String[] args) { Car car = new Car(); //先記錄日志,再記錄時(shí)間// CarTimeProxy ctp = new CarTimeProxy(car);// CarLogProxy clp = new CarLogProxy(ctp);// clp.move(); //先記錄時(shí)間,再記錄日志 CarLogProxy clp = new CarLogProxy(car); CarTimeProxy ctp = new CarTimeProxy(clp); ctp.move(); }}

使用JDK動(dòng)態(tài)代理實(shí)現(xiàn)的例子:

1.創(chuàng)建一個(gè)實(shí)現(xiàn)接口InvocationHandler的類,它必須實(shí)現(xiàn)invoke()方法。

2.創(chuàng)建被代理類及接口

3.調(diào)用Proxy的靜態(tài)方法,創(chuàng)建一個(gè)代理類

4.通過(guò)代理調(diào)用方法

/** * 使用jdk的動(dòng)態(tài)代理 * @author Administrator * */public class TimeHandler implements InvocationHandler { /** * 被代理對(duì)象 */ private Object target; public TimeHandler(Object target) { super(); this.target = target; } /** * 參數(shù): * proxy : 被代理對(duì)象 * method : 被代理對(duì)象的方法 * args : 方法的參數(shù) * 返回值: * Object 方法的返回值 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //在執(zhí)行被代理對(duì)象的方法之前執(zhí)行自己的邏輯 long startTime = System.currentTimeMillis(); System.out.println('汽車開(kāi)始行駛...'); //執(zhí)行被代理對(duì)象的方法 method.invoke(target); //在執(zhí)行被代理對(duì)象的方法之后執(zhí)行自己的邏輯 long endTime = System.currentTimeMillis(); System.out.println('汽車行駛結(jié)束... 汽車行駛時(shí)間:'+(endTime-startTime)+'毫秒。'); return null; }}

/** * JDK動(dòng)態(tài)代理測(cè)試類 * @author Administrator * */ public class JdkProxyTest { public static void main(String[] args) { Car car = new Car(); InvocationHandler h = new TimeHandler(car); Class<?> cls = car.getClass(); /** * 參數(shù): * loader : 類加載器 * interfaces : 實(shí)現(xiàn)接口 * h InvocationHandler */ Moveable m= (Moveable)Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(), h); //執(zhí)行被代理類的方法 m.move(); } }

使用CGLIB動(dòng)態(tài)代理實(shí)現(xiàn)的例子:

1.創(chuàng)建代理類,實(shí)現(xiàn)MethodInterceptor接口

2.使用Enhancer類創(chuàng)建代理方法

3.創(chuàng)建被代理類,并編寫(xiě)代理方法

4.通過(guò)代理調(diào)用方法

/** * 使用cglib動(dòng)態(tài)代理 * @author Administrator * */public class Train { public void move(){ System.out.println('火車行駛中。。。'); }}

public class CglibProxy implements MethodInterceptor { private Enhancer enhancer = new Enhancer(); //創(chuàng)建代理類方法 public Object getProxy(Class clazz){ //設(shè)置創(chuàng)建子類的類 enhancer.setSuperclass(clazz); //回調(diào)函數(shù) enhancer.setCallback(this); //創(chuàng)建并返回子類的實(shí)例 return enhancer.create(); } /** * 作用:攔截所有目標(biāo)類方法的調(diào)用 * obj : 目標(biāo)類的實(shí)例 * m : 目標(biāo)方法的反射對(duì)象 * args : 方法的參數(shù) * proxy : 代理類的實(shí)例 */ @Override public Object intercept(Object obj, Method m, Object[] args, MethodProxy proxy) throws Throwable { //在調(diào)用方法時(shí)實(shí)現(xiàn)自己的業(yè)務(wù)邏輯 System.out.println('日志開(kāi)始...'); //代理類調(diào)用父類的方法 proxy.invokeSuper(obj, args); //調(diào)用方法之后實(shí)現(xiàn)自己的業(yè)務(wù)邏輯 System.out.println('日志結(jié)束...'); return null; }}

/** * 使用cglib動(dòng)態(tài)代理的測(cè)試類 * @author Administrator * */ public class CglibProxyTest { public static void main(String[] args) { CglibProxy proxy = new CglibProxy(); //傳入要代理的類 Train t = (Train)proxy.getProxy(Train.class); //執(zhí)行方法 t.move(); } }

以上就是詳解JAVA設(shè)計(jì)模式之代理模式的詳細(xì)內(nèi)容,更多關(guān)于JAVA 代理模式的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99久久婷婷这里只有精品| 亚洲激情二区| 日韩一区精品视频| 亚洲精品中文字幕乱码| 老色鬼精品视频在线观看播放| 日韩一区二区中文| 久久久国产精品网站| 亚洲人www| 夜久久久久久| 欧美日韩亚洲在线观看| 国产成人精品三级高清久久91| 蜜桃视频第一区免费观看| 成人亚洲精品| 成人在线免费观看网站| 亚洲一区二区网站| 欧美粗暴jizz性欧美20| 久久uomeier| 欧美成人精品三级网站| 日韩国产在线一| 国产午夜精品一区二区三区欧美| 久久久久99| 国产欧美日韩| 久久wwww| 精品国产aⅴ| 亚洲风情在线资源| 精品亚洲成人| 国产精品成人a在线观看| 国产一区二区三区视频在线| 久久免费精品| 欧美va天堂在线| 日韩国产欧美在线播放| 福利精品在线| 一区二区三区国产在线| 日本一不卡视频| 高清av不卡| 日韩国产在线观看一区| 欧美日韩尤物久久| 日韩专区视频网站| av亚洲免费| 美国三级日本三级久久99| 中文字幕一区二区三区日韩精品| 欧美精品第一区| 欧美二三四区| 久久精品97| 日韩毛片在线| 国产精久久一区二区| 成人羞羞视频播放网站| 天堂av在线一区| 青青草国产成人99久久| 久久亚洲精精品中文字幕| 99pao成人国产永久免费视频| 日本强好片久久久久久aaa| 136国产福利精品导航网址| 欧美天堂在线| 亚洲不卡系列| 国产精品任我爽爆在线播放 | 在线综合亚洲| 成人亚洲欧美| 国产精品久久免费视频| 在线一区欧美| 国产一区二区三区久久| 日韩国产欧美三级| 国产亚洲精品v| 精品三级在线观看视频| 91精品日本| 尹人成人综合网| 久久久蜜桃一区二区人| 国产精品视频一区二区三区四蜜臂| 久久精品青草| 日韩高清不卡一区| 热久久久久久久| 五月天久久网站| 欧美特黄一区| 精品欧美久久| 黄色精品网站| 999久久久精品国产| 天堂资源在线亚洲| www成人在线视频| 国产精品精品| 久久久久国产一区二区| 色爱综合网欧美| 国内精品麻豆美女在线播放视频| 日本综合精品一区| 亚洲色图国产| 久久香蕉精品| 日韩美女国产精品| 日本三级亚洲精品| 国产一区二区三区四区二区| 国产一区精品福利| 亚洲午夜精品久久久久久app| 91欧美在线| 亚洲我射av| 国产日韩视频| 伊人久久在线| 蜜桃视频第一区免费观看| 日韩精品亚洲专区| 欧美日韩夜夜| 99久久激情| 日韩高清在线观看一区二区| 美女视频免费精品| 久久久久91| 日本午夜精品久久久| 国产aa精品| 怡红院精品视频在线观看极品| 欧美日韩国产综合网| 亚洲影视一区| 精品一区二区三区中文字幕视频| 欧美男人天堂| 亚洲一区二区毛片| 精品亚洲精品| 蜜桃av一区二区| 久久精品免视看国产成人| 日本美女一区| 国产精品调教| 丝袜美腿亚洲色图| 国产精品精品国产一区二区| 亚洲欧洲一区二区天堂久久| 久久高清免费| 亚洲日产av中文字幕| 日韩国产一区二区| 欧美午夜精品一区二区三区电影| 亚洲乱亚洲高清| 日韩亚洲一区在线| 欧美激情日韩| 日韩精品免费一区二区夜夜嗨| 精品欧美一区二区三区在线观看| 亚洲视频电影在线| 99国产精品视频免费观看一公开| 国产精品66| 国产欧美欧美| 在线精品一区| 国产婷婷精品| 性欧美69xoxoxoxo| 蜜桃成人精品| 精品久久中文| 欧美黑人巨大videos精品| 亚洲精品福利| 亚洲日本国产| 国产精品手机在线播放| 女生影院久久| 亚洲精品国产日韩| 香蕉视频成人在线观看| 不卡中文一二三区| 激情五月色综合国产精品| 激情综合亚洲| 久久福利一区| 天堂俺去俺来也www久久婷婷| 日韩欧美中文在线观看| 久久精品xxxxx| 亚洲精品极品| 国产精品腿扒开做爽爽爽挤奶网站| 88xx成人免费观看视频库| 国产午夜精品一区在线观看| 国产精品午夜一区二区三区| 国产亚洲电影| 国产一区二区三区久久久久久久久| 国产精品一国产精品| 高清av一区| 亚洲在线一区| 国产精品天堂蜜av在线播放| 久久久久久久久成人| 亚洲精品综合| 国产精品男女| 视频福利一区| 亚洲精品大片| 美女国产精品久久久| 日韩88av| 夜夜嗨av一区二区三区网站四季av| 日韩国产成人精品| 人人香蕉久久| 91精品丝袜国产高跟在线| 国产欧洲在线| 欧美日一区二区在线观看| 亚洲成av在线| 国产伦精品一区二区三区视频 | 欧美日韩18| 亚洲欧洲高清| 69堂免费精品视频在线播放| 91视频久久| 亚洲免费观看| 人人精品亚洲| 里番精品3d一二三区| 免费看日韩精品| 91精品国产乱码久久久久久久| 亚洲精品大片| 欧美专区在线| 欧美一区二区三区高清视频| 国产精品夜夜夜| 热久久免费视频| 成人一二三区| 欧美在线精品一区| 亚洲毛片网站| 亚洲欧美专区| 一区二区国产在线| 水野朝阳av一区二区三区| 久久免费大视频| 一区二区小说| 美女网站视频一区| 日本欧美不卡| 婷婷激情一区|