国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

代理模式,拿下!??!

開發 前端
代理模式是給一個對象提供一個代理對象,并由代理對象控制對原對象的引用。通俗來講,代理模式就是我們所熟知的中介。

[[422489]]

本文轉載自微信公眾號「小郎碼知答」,作者simon郎。轉載本文請聯系小郎碼知答公眾號。

代理模式是給一個對象提供一個代理對象,并由代理對象控制對原對象的引用。

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

以我們熟知的商品代購為例:

商品代購

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

如果直接去工廠購買,我們在購買前需要對自己要買的物品做一些調研,然后去工廠直接去提貨,這樣什么事情都需要自己親力親為。

如果我們通過代購購買,我們只需要告訴代購我們需要什么,剩下的事情代購會幫我們處理(調研、拿貨),最終給我們需要的相應的物品。

因此,代理模式的目標如下:

(1)通過引用代理對象的方式來間接訪問目標對象,防止直接訪問目標對象給系統帶來不必要的復雜性。

(2)通過代理對象對原有的業務進行增強。

通常情況下,按照代理的創建時期,一般可以分為兩種:

  • 靜態代理

靜態代理是由程序員或者特定的工具自動生成的源代碼,再對其編譯,在程序運行之前,代理類編譯的生成的.class文件就已經存在了

  • 動態代理

動態代理是在程序運行時,通過反射機制動態創建而成。

1、靜態代理模式

靜態代理中的代理類和委托類的關系在運行前就確定了,如圖所示:

靜態代理

特別注意幾個概念:

  • 抽象對象

抽象對象聲明了真實對象和代理對象的公共接口。

  • 真實對象

代理對象所代表的真實對象,最終被引用的對象。

  • 代理對象

包含真實對象進而操作真實對象,相當于訪問者與真實對象直接的中介。

下面,我們來舉個例子:

(1)創建服務類接口

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

(2)服務實現類

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

(3)創建代理類

  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("買車前的調研......"); 
  10.         buyCar.buycar(); 
  11.         System.out.println("買車后的保養......"); 
  12.  
  13.  
  14.     } 

(4)編寫測試類

  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.     } 

優點:靜態代理在不修改目標對象的前提下,可以通過代理對象對目標對象進行擴展。

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

缺點:代理類和具體的實現類實現了相同的接口,代理類通過實現類實現了相同的方法。這樣就出現了大量的代碼重復。如果接口增加一個方法,除了所有實現類需要實現這個方法外,所有代理類也需要實現此方法。增加了代碼維護的復雜度。

代理對象只服務于一種類型的對象,如果要服務多類型的對象。勢必要為每一種對象都進行代理,靜態代理在程序規模稍大時就無法勝任了。

2、動態代理模式

2.1 JDK自帶

事實上,單一的代理是不存的,一個代理可以同時身兼數職。既可以代購車,也可以代購房。

在動態代理中我們不再需要手動的創建代理類,我們只需要一個動態處理器就可以了,而真正的代理對象由JDK運行時動態的創建。

(1)創建服務類接口

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

(2)服務實現類

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

(3)動態代理類

  1. //通過實現 InvocationHandler 接口創建自己的調用處理器; 
  2. public class ProxyHandler implements InvocationHandler { 
  3.  
  4.     private Object object; 
  5.     //通過構造函數創建動態代理類實例,構造時調用處理器對象作為參數被傳入。 
  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)測試類

  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.          * 通過為 Proxy 類指定 ClassLoader 對象和一組 interface 來創建動態代理類; 
  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()方法接受三個參數:

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

ClassLoader loader:指定當前目標對象使用類加載器,獲取加載器的方法是固定的。

Class[] interfaces:指定目標對象實現的接口的類型,使用泛型方式確認類型。

InvocationHandler h:指定動態處理器,執行目標對象的方法時,會觸發事件處理器的方法。

2.2 CGLIB

CGLIB相比于JDK動態代理更加強大,JDK動態代理雖然簡單易用,但是其有一個致命缺陷是,只能對接口進行代理。如果要代理的類為一個普通類、沒有接口,那么Java動態代理就沒法使用了。

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

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

(1)目標類

  • 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.     } 

參數解釋:

  • Object表示要進行增強的對象
  • Method表示攔截的方法
  • Object[]數組表示參數列表,基本數據類型需要傳入其包裝類型,如int-->Integer、long-Long、double-->Double
  • MethodProxy表示對方法的代理,invokeSuper方法表示對被代理對象方法的調用

(3)測試

  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.   //設置要繼承的父類 
  7.         enhancer.setSuperclass(Dao.class); 
  8.         enhancer1.setSuperclass(Dao1.class); 
  9.         //設置回調方法 
  10.         enhancer.setCallback(daoProxy); 
  11.         enhancer1.setCallback(daoProxy); 
  12.  
  13.         //創建動態代理類 
  14.         Dao dao = (Dao)enhancer.create(); 
  15.         Dao1 dao1= (Dao1) enhancer1.create(); 
  16.         dao.update(); 
  17.         System.out.println("..................................."); 
  18.         dao1.select(); 
  19.     } 

 

責任編輯:武曉燕 來源: 小郎碼知答
相關推薦

2011-04-06 11:41:25

Java動態代理

2012-02-29 09:41:14

JavaScript

2012-01-13 15:59:07

2021-06-29 08:54:23

設計模式代理模式遠程代理

2011-03-23 10:40:51

java代理模式

2010-03-25 08:52:30

PHP設計模式代理模式

2024-02-26 11:52:38

代理模式設計

2022-11-30 17:05:33

代碼程序場景

2024-04-10 12:27:43

Python設計模式開發

2022-09-07 08:25:08

代理模式設計模式代碼

2025-01-09 11:15:47

2011-11-17 14:32:45

Java靜態代理動態代理

2011-11-21 12:56:10

Java代理模式設計模式

2021-08-04 09:51:02

代理設計模式

2011-11-24 21:03:10

ibmdw

2023-09-28 15:43:03

裝飾者模式代理定義

2012-06-28 13:55:10

2021-10-26 10:40:26

代理模式虛擬

2024-04-16 00:07:36

設計模式代理模式替身

2021-01-07 09:34:19

HTTPSHTTP抓包
點贊
收藏

51CTO技術棧公眾號

日韩精品丝袜美腿| 毛片av一区二区三区| 在线成人免费视频| 欧美v在线观看| 天天色综合色| 萌白酱国产一区二区| 欧美videos极品另类| 国产精品免费视频观看| 日本高清不卡一区二区三| 亚洲激情77| 久久精品一区中文字幕| av免费看在线| 精品人伦一区二区三区蜜桃免费| 大西瓜av在线| 久久精品一区二区国产| 2019中文字幕在线| 91综合国产| 亚洲国语精品自产拍在线观看| 精东影业在线观看| 国产精品拍天天在线| 男人天堂a在线| 毛片av一区二区| 久久影视中文粉嫩av| 青青草国产成人a∨下载安卓| 大量国产精品视频| 欧美电影免费观看高清完整| 欧美日本国产一区| 日韩av资源站| 亚洲成av人影院在线观看网| 成人黄色激情网站| 日本一区二区三区免费乱视频| 激情图片qvod| 蜜桃精品视频在线| 久久久免费看| 精品999网站| av电影成人| 婷婷久久国产对白刺激五月99| 欧美一乱一性一交一视频| 日韩有吗在线观看| 美女少妇精品视频| 国产亚洲精aa在线看| 久久精品视频播放| 欧美a级大片在线| 欧美精品电影免费在线观看| 超碰国产精品一区二页| 久久成人在线视频| **爰片久久毛片| 97国产精品视频人人做人人爱| 91精品视频一区二区| 久久福利网址导航| 中文字幕一区日韩精品| 性色av一区二区咪爱| 欧美毛片免费观看| 91精品国产成人www| 婷婷精品在线| 国产精品欧美一区二区三区奶水| 伊人成综合网伊人222| 国产精品看片资源| 欧美国产日本| 欧美一区二区三区电影在线观看| 国产精品久久久久久久久久妞妞| 欧美精品二区三区四区免费看视频 | 综合激情网站| 精品无人区一区二区三区竹菊| 亚洲美女毛片| 在线看成人av电影| 北条麻妃一区二区三区| 中文字幕第36页| 亚洲第一搞黄网站| 毛片在线视频| 国产亚洲人成网站在线观看| 亚洲视频自拍| 日韩av成人在线| 亚洲天堂激情| 国产内射老熟女aaaa| 久久免费电影网| 中文字幕一区免费| 日韩女优av电影在线观看| 欧美激情三区| 成人在线视频网| 国产一区二区视频在线| 日本激情视频在线播放| 精品久久久久久久久久国产| 女子免费在线观看视频www| 色妞欧美日韩在线| 欧美电影《睫毛膏》| 日韩欧美视频一区二区| 不卡在线观看av| www污污在线| 亚洲精品综合久久中文字幕| 欧美黑人做爰爽爽爽| 欧美在线视频二区| 亚洲色图欧美激情| av资源中文在线| 国产成人精品在线| 国产一区二区在线看| 伊人网在线视频| 色偷偷88888欧美精品久久久| 亚洲国产不卡| 波多野结衣家庭教师视频| 色噜噜狠狠成人中文综合| av一级久久| 欧美一区二视频在线免费观看| 久久久久久久免费视频了| av片在线看| 欧洲中文字幕国产精品| 精品一区二区三区在线播放| 性疯狂做受xxxx高清视频| 亚洲第一福利在线观看| 成人在线免费小视频| 全黄性性激高免费视频| 欧美性受xxxx黑人xyx性爽| 日韩在线亚洲| 中文字幕色一区二区| 精品国产精品自拍| 成人国产精品久久| 翔田千里亚洲一二三区| 亚洲不卡在线观看| 亚洲高清999| 亚洲高潮无码久久| 7777精品久久久大香线蕉| 国产va免费精品观看精品视频 | 成人高清免费在线| 日韩美女中文字幕| 国产成人免费在线视频| 在线观看免费版| 国产精品aaaa| 久久精品在线观看| 成人午夜视屏| 日本一区二区精品| 精品视频全国免费看| 欧美人与拘性视交免费看| 欧美 日韩 亚洲 一区| 精品国产免费人成电影在线观看四季 | 国产91在线看| 麻豆传媒视频在线| 国产在线视频一区| 中文字幕一区不卡| 成人免费福利| 日韩电影免费观看在| 在线亚洲一区观看| 欧美韩国日本在线观看| 国产va在线| 韩剧1988免费观看全集| 2021久久国产精品不只是精品| 女海盗2成人h版中文字幕| 蜜桃狠狠色伊人亚洲综合网站| 激情懂色av一区av二区av| 欧美日韩123| 黄p免费网站| 国产91精品久久久久久久| 久久久久免费观看| 曰本一区二区| 国内精品在线观看视频| 亚洲午夜女主播在线直播| 九一九一国产精品| 牛牛精品一区二区| 99在线免费视频观看| 自拍偷拍亚洲区| 99精品视频在线观看| 激情久久一区二区| 青青草国产免费| 在线看福利67194| 成人91在线观看| 久久丁香四色| 99热在线观看免费| 国产成人一区二区三区电影| 亚洲精品视频一区二区| 国产麻豆一区二区三区精品视频| 亚洲jjzzjjzz在线观看| 国产成人91久久精品| 激情成人在线视频| 久久久久国产精品一区三寸| 日本无删减在线| 青青视频免费在线| 九九精品在线视频| 一区二区三区欧美亚洲| 91综合网人人| 免费网站成人| 熟女视频一区二区三区| 久久久av亚洲男天堂| 国产精品情趣视频| 99欧美视频| 国产第一页在线视频| 玩弄中年熟妇正在播放| 欧美在线不卡区| 91黄色激情网站| 国产在线不卡视频| 粉嫩久久久久久久极品| 中文字字幕在线中文乱码电影| 国产高清在线一区二区| 亚洲精品久久久久久久久| 91天堂素人约啪| 999精品色在线播放| 欧美韩日亚洲| 别急慢慢来1978如如2| 91精品久久久久久久久青青| 日韩欧美一级二级三级| 久久精品欧美一区二区三区不卡 | 免费毛片小视频|