偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

代理模式,拿下!??!

開發(fā) 前端
代理模式是給一個(gè)對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象控制對(duì)原對(duì)象的引用。通俗來(lái)講,代理模式就是我們所熟知的中介。

[[422489]]

本文轉(zhuǎn)載自微信公眾號(hào)「小郎碼知答」,作者simon郎。轉(zhuǎn)載本文請(qǐng)聯(lián)系小郎碼知答公眾號(hào)。

代理模式是給一個(gè)對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象控制對(duì)原對(duì)象的引用。

通俗來(lái)講,代理模式就是我們所熟知的中介。

以我們熟知的商品代購(gòu)為例:

商品代購(gòu)

假如我們需要買一個(gè)物品,我們可以直接去工廠里購(gòu)買;也可以找代購(gòu)。

如果直接去工廠購(gòu)買,我們?cè)谫?gòu)買前需要對(duì)自己要買的物品做一些調(diào)研,然后去工廠直接去提貨,這樣什么事情都需要自己親力親為。

如果我們通過(guò)代購(gòu)購(gòu)買,我們只需要告訴代購(gòu)我們需要什么,剩下的事情代購(gòu)會(huì)幫我們處理(調(diào)研、拿貨),最終給我們需要的相應(yīng)的物品。

因此,代理模式的目標(biāo)如下:

(1)通過(guò)引用代理對(duì)象的方式來(lái)間接訪問(wèn)目標(biāo)對(duì)象,防止直接訪問(wèn)目標(biāo)對(duì)象給系統(tǒng)帶來(lái)不必要的復(fù)雜性。

(2)通過(guò)代理對(duì)象對(duì)原有的業(yè)務(wù)進(jìn)行增強(qiáng)。

通常情況下,按照代理的創(chuàng)建時(shí)期,一般可以分為兩種:

  • 靜態(tài)代理

靜態(tài)代理是由程序員或者特定的工具自動(dòng)生成的源代碼,再對(duì)其編譯,在程序運(yùn)行之前,代理類編譯的生成的.class文件就已經(jīng)存在了

  • 動(dòng)態(tài)代理

動(dòng)態(tài)代理是在程序運(yùn)行時(shí),通過(guò)反射機(jī)制動(dòng)態(tài)創(chuàng)建而成。

1、靜態(tài)代理模式

靜態(tài)代理中的代理類和委托類的關(guān)系在運(yùn)行前就確定了,如圖所示:

靜態(tài)代理

特別注意幾個(gè)概念:

  • 抽象對(duì)象

抽象對(duì)象聲明了真實(shí)對(duì)象和代理對(duì)象的公共接口。

  • 真實(shí)對(duì)象

代理對(duì)象所代表的真實(shí)對(duì)象,最終被引用的對(duì)象。

  • 代理對(duì)象

包含真實(shí)對(duì)象進(jìn)而操作真實(shí)對(duì)象,相當(dāng)于訪問(wèn)者與真實(shí)對(duì)象直接的中介。

下面,我們來(lái)舉個(gè)例子:

(1)創(chuàng)建服務(wù)類接口

  1. public interface BuyCar { 
  2.     void buycar(); 

(2)服務(wù)實(shí)現(xiàn)類

  1. public class BuyCarImpl implements BuyCar{ 
  2.     public void buycar() { 
  3.         System.out.println("買一輛奧迪"); 
  4.     } 

(3)創(chuàng)建代理類

  1. public class BuyCarProxy implements BuyCar{ 
  2.      
  3.     private BuyCar buyCar; 
  4.  
  5.     public BuyCarProxy(BuyCar buyCar){ 
  6.         this.buyCar = buyCar; 
  7.     } 
  8.     public void buycar() { 
  9.         System.out.println("買車前的調(diào)研......"); 
  10.         buyCar.buycar(); 
  11.         System.out.println("買車后的保養(yǎng)......"); 
  12.  
  13.  
  14.     } 

(4)編寫測(cè)試類

  1. public class ProxyTest { 
  2.     public static void main(String[] args) { 
  3.         BuyCarImpl buyCar = new BuyCarImpl(); 
  4.         BuyCarProxy buyCarProxy = new BuyCarProxy(buyCar); 
  5.         buyCarProxy.buycar(); 
  6.     } 

優(yōu)點(diǎn):靜態(tài)代理在不修改目標(biāo)對(duì)象的前提下,可以通過(guò)代理對(duì)象對(duì)目標(biāo)對(duì)象進(jìn)行擴(kuò)展。

代理類可以使得客戶端不需要知道具體的實(shí)現(xiàn)類是什么,怎么做的,客戶端只需知道代理即可(解耦合)

缺點(diǎn):代理類和具體的實(shí)現(xiàn)類實(shí)現(xiàn)了相同的接口,代理類通過(guò)實(shí)現(xiàn)類實(shí)現(xiàn)了相同的方法。這樣就出現(xiàn)了大量的代碼重復(fù)。如果接口增加一個(gè)方法,除了所有實(shí)現(xiàn)類需要實(shí)現(xiàn)這個(gè)方法外,所有代理類也需要實(shí)現(xiàn)此方法。增加了代碼維護(hù)的復(fù)雜度。

代理對(duì)象只服務(wù)于一種類型的對(duì)象,如果要服務(wù)多類型的對(duì)象。勢(shì)必要為每一種對(duì)象都進(jìn)行代理,靜態(tài)代理在程序規(guī)模稍大時(shí)就無(wú)法勝任了。

2、動(dòng)態(tài)代理模式

2.1 JDK自帶

事實(shí)上,單一的代理是不存的,一個(gè)代理可以同時(shí)身兼數(shù)職。既可以代購(gòu)車,也可以代購(gòu)房。

在動(dòng)態(tài)代理中我們不再需要手動(dòng)的創(chuàng)建代理類,我們只需要一個(gè)動(dòng)態(tài)處理器就可以了,而真正的代理對(duì)象由JDK運(yùn)行時(shí)動(dòng)態(tài)的創(chuàng)建。

(1)創(chuàng)建服務(wù)類接口

  1. //買車接口 
  2. public interface BuyCar { 
  3.     void buycar(); 
  4. //買房接口 
  5. public interface BuyHouse { 
  6.     void buyHouse(); 

(2)服務(wù)實(shí)現(xiàn)類

  1. //買車接口的實(shí)現(xiàn)類 
  2. public class BuyCarImpl implements BuyCar { 
  3.     public void buycar() { 
  4.         System.out.println("買一輛奧迪"); 
  5.     } 
  6. //買房接口的實(shí)現(xiàn)類 
  7. public class BuyHouseImpl implements BuyHouse{ 
  8.     public void buyHouse() { 
  9.         System.out.println("買一棟大別墅"); 
  10.     } 

(3)動(dòng)態(tài)代理類

  1. //通過(guò)實(shí)現(xiàn) InvocationHandler 接口創(chuàng)建自己的調(diào)用處理器; 
  2. public class ProxyHandler implements InvocationHandler { 
  3.  
  4.     private Object object; 
  5.     //通過(guò)構(gòu)造函數(shù)創(chuàng)建動(dòng)態(tài)代理類實(shí)例,構(gòu)造時(shí)調(diào)用處理器對(duì)象作為參數(shù)被傳入。 
  6.     public ProxyHandler(Object object){ 
  7.         this.object = object; 
  8.     } 
  9.  
  10.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
  11.         System.out.println("Before invoke "+method.getName()); 
  12.         method.invoke(object,args); 
  13.         System.out.println("After invoke "+method.getName()); 
  14.         return null
  15.     } 

(4)測(cè)試類

  1. public class DynamicProxyTest { 
  2.     public static void main(String[] args){ 
  3.         BuyHouse buyHouse = new BuyHouseImpl(); 
  4.         BuyCar buyCar = new BuyCarImpl(); 
  5.  
  6.         InvocationHandler handler = new ProxyHandler(buyHouse); 
  7.         InvocationHandler handler1 = new ProxyHandler(buyCar); 
  8.  
  9.         /** 
  10.          * 通過(guò)為 Proxy 類指定 ClassLoader 對(duì)象和一組 interface 來(lái)創(chuàng)建動(dòng)態(tài)代理類; 
  11.          */ 
  12.         BuyHouse proxyHouse = (BuyHouse) Proxy.newProxyInstance(buyHouse.getClass().getClassLoader(), buyHouse.getClass().getInterfaces(),handler); 
  13.         BuyCar proxyCar = (BuyCar) Proxy.newProxyInstance(buyCar.getClass().getClassLoader(), buyCar.getClass().getInterfaces(),handler1); 
  14.         proxyHouse.buyHouse(); 
  15.         proxyCar.buycar(); 
  16.          
  17.     } 

注意Proxy.newProxyInstance()方法接受三個(gè)參數(shù):

  1. public static Object newProxyInstance(ClassLoader loader, 
  2.                                          Class<?>[] interfaces, 
  3.                                          InvocationHandler h) 

ClassLoader loader:指定當(dāng)前目標(biāo)對(duì)象使用類加載器,獲取加載器的方法是固定的。

Class[] interfaces:指定目標(biāo)對(duì)象實(shí)現(xiàn)的接口的類型,使用泛型方式確認(rèn)類型。

InvocationHandler h:指定動(dòng)態(tài)處理器,執(zhí)行目標(biāo)對(duì)象的方法時(shí),會(huì)觸發(fā)事件處理器的方法。

2.2 CGLIB

CGLIB相比于JDK動(dòng)態(tài)代理更加強(qiáng)大,JDK動(dòng)態(tài)代理雖然簡(jiǎn)單易用,但是其有一個(gè)致命缺陷是,只能對(duì)接口進(jìn)行代理。如果要代理的類為一個(gè)普通類、沒(méi)有接口,那么Java動(dòng)態(tài)代理就沒(méi)法使用了。

在使用cglib前,需要先添加依賴。

  1. <dependency> 
  2.             <groupId>cglib</groupId> 
  3.             <artifactId>cglib</artifactId> 
  4.             <version>3.2.12</version> 
  5.         </dependency> 

(1)目標(biāo)類

  • Dao
  1. public class Dao { 
  2.     public void update() { 
  3.         System.out.println("PeopleDao.update()"); 
  4.     } 
  • Dao1
  1. public class Dao1 { 
  2.     public void select(){ 
  3.         System.out.println("PeopleDao.select"); 
  4.     } 

(2)代理類

  1. public class DaoProxy implements MethodInterceptor { 
  2.     public Object intercept(Object object, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { 
  3.         System.out.println("Befor Metod Invoke"); 
  4.         methodProxy.invokeSuper(object,objects); 
  5.         System.out.println("After Method Invoke"); 
  6.         return null
  7.     } 

參數(shù)解釋:

  • Object表示要進(jìn)行增強(qiáng)的對(duì)象
  • Method表示攔截的方法
  • Object[]數(shù)組表示參數(shù)列表,基本數(shù)據(jù)類型需要傳入其包裝類型,如int-->Integer、long-Long、double-->Double
  • MethodProxy表示對(duì)方法的代理,invokeSuper方法表示對(duì)被代理對(duì)象方法的調(diào)用

(3)測(cè)試

  1. public class CglibProxyTest { 
  2.     public static void main(String[] args) { 
  3.         DaoProxy daoProxy = new DaoProxy(); 
  4.         Enhancer enhancer = new Enhancer(); 
  5.         Enhancer enhancer1 = new Enhancer(); 
  6.   //設(shè)置要繼承的父類 
  7.         enhancer.setSuperclass(Dao.class); 
  8.         enhancer1.setSuperclass(Dao1.class); 
  9.         //設(shè)置回調(diào)方法 
  10.         enhancer.setCallback(daoProxy); 
  11.         enhancer1.setCallback(daoProxy); 
  12.  
  13.         //創(chuàng)建動(dòng)態(tài)代理類 
  14.         Dao dao = (Dao)enhancer.create(); 
  15.         Dao1 dao1= (Dao1) enhancer1.create(); 
  16.         dao.update(); 
  17.         System.out.println("..................................."); 
  18.         dao1.select(); 
  19.     } 

 

責(zé)任編輯:武曉燕 來(lái)源: 小郎碼知答
相關(guān)推薦

2011-04-06 11:41:25

Java動(dòng)態(tài)代理

2012-02-29 09:41:14

JavaScript

2012-01-13 15:59:07

2021-06-29 08:54:23

設(shè)計(jì)模式代理模式遠(yuǎn)程代理

2011-03-23 10:40:51

java代理模式

2010-03-25 08:52:30

PHP設(shè)計(jì)模式代理模式

2024-02-26 11:52:38

代理模式設(shè)計(jì)

2022-11-30 17:05:33

代碼程序場(chǎng)景

2024-04-10 12:27:43

Python設(shè)計(jì)模式開發(fā)

2025-01-09 11:15:47

2022-09-07 08:25:08

代理模式設(shè)計(jì)模式代碼

2011-11-17 14:32:45

Java靜態(tài)代理動(dòng)態(tài)代理

2021-01-07 09:34:19

HTTPSHTTP抓包

2023-09-28 15:43:03

裝飾者模式代理定義

2021-10-26 10:40:26

代理模式虛擬

2011-11-24 21:03:10

ibmdw

2012-06-28 13:55:10

2011-11-21 12:56:10

Java代理模式設(shè)計(jì)模式

2021-08-04 09:51:02

代理設(shè)計(jì)模式

2024-04-16 00:07:36

設(shè)計(jì)模式代理模式替身
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)