亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

詳解Java 中的三種代理模式

2024-07-14 08:42:03
字體:
來源:轉載
供稿:網友

代理模式

代理(Proxy)是一種設計模式,提供了對目標對象另外的訪問方式;即通過代理對象訪問目標對象.這樣做的好處是:可以在目標對象實現的基礎上,增強額外的功能操作,即擴展目標對象的功能。

這里使用到編程中的一個思想:不要隨意去修改別人已經寫好的代碼或者方法,如果需改修改,可以通過代理的方式來擴展該方法。

舉個例子來說明代理的作用:假設我們想邀請一位明星,那么并不是直接連接明星,而是聯系明星的經紀人,來達到同樣的目的.明星就是一個目標對象,他只要負責活動中的節目,而其他瑣碎的事情就交給他的代理人(經紀人)來解決.這就是代理思想在現實中的一個例子。

代理模式的 關鍵點是:代理對象與目標對象.代理對象是對目標對象的擴展,并會調用目標對象 .

靜態代理

靜態代理在使用時,需要定義接口或者父類,被代理對象與代理對象一起實現相同的接口或者是繼承相同父類。

實例說明:

模擬保存動作,定義一個保存動作的接口:IUserDao.java,然后目標對象實現這個接口的方法UserDao.java,此時如果使用靜態代理方式,就需要在代理對象(UserDaoProxy.java)中也實現IUserDao接口.調用的時候通過調用代理對象的方法來調用目標對象。

需要 注意 的是,代理對象與目標對象要實現相同的接口,然后通過調用相同的方法來調用目標對象的方法。

接口:IUserDao.java

package net.ydstudio.service;/** * @author Nick * @projectName javaLean * @package net.ydstudio.service * @createDate 2018/08/16 15:35 * @updateDate 2018/08/16 15:35 */public interface IUserDao {  /**   * 保存數據庫   * @param: []   * @return: void   */  void save();}

目標對象:UserDao.java

package net.ydstudio.service.impl;import net.ydstudio.service.IUserDao;/** * @author Nick * @projectName javaLean * @package net.ydstudio.service.impl * @createDate 2018/08/16 15:36 * @updateDate 2018/08/16 15:36 */public class UserDao implements IUserDao {  /**   * 保存數據庫   *   * @param: []   * @return: void   */  public void save() {    System.out.println("數據已經保存到數據庫");  }}

代理對象:UserDaoProxy.java

package net.ydstudio.staticproxy;import net.ydstudio.service.IUserDao;import net.ydstudio.service.impl.UserDao;/** * @author Nick * @projectName javaLean * @package net.ydstudio.staticproxy * @createDate 2018/08/16 15:37 * @updateDate 2018/08/16 15:37 */public class UserDaoProxy implements IUserDao {  /**   * 保存被代理的對象   */  private UserDao target;  public UserDaoProxy(UserDao target) {    this.target = target;  }  /**   * 保存數據庫   *   * @param: []   * @return: void   */  public void save() {    System.out.println("開始保存數據……");    target.save();    System.out.println("結束保存數據……");  }}

測試類:

package net.ydstudio.proxy;import net.ydstudio.service.IUserDao;import net.ydstudio.service.impl.UserDao;import org.junit.Test;import org.junit.runner.RunWith;import org.junit.runners.JUnit4;import static org.junit.Assert.*;/** * @author Nick * @projectName javaLean * @package net.ydstudio.proxy * @createDate 2018/08/16 15:58 * @updateDate 2018/08/16 15:58 */@RunWith(JUnit4.class)public class ProxyFactoryTest {  @Test  public void test(){    // 目標對象    IUserDao target = new UserDao();    System.out.println(target.getClass());    // 給目標對象,創建代理對象    IUserDao proxy = (IUserDao)new ProxyFactory(target).getProxyInstance();    // class $Proxy()內存中動態生成的代理對象    System.out.println(proxy.getClass());    // 執行方法 代理對象    proxy.save();  }}

靜態代理總結:

  • 可以在不修改代理目標對象的前提下,對代理目標的功能進行拓展。
  • 需要實現代理目標對象實現的接口,一旦代理目標所實現的接口有修改,目標對象與代理都需要維護。

要解決上面靜態代理的缺點,就必須使用動態代理的方式。

動態代理

動態代理有以下特點:

  • 代理對象,不需要實現接口
  • 代理對象的生成,是利用JDK的API,動態的在內存中構建代理對象(需要我們指定創建代理對象/目標對象實現的接口的類型)
  • 動態代理也叫做:JDK代理,接口代理

JDK中生成代理對象的api

JDK實現代理只需要使用靜態的newProxyInstance方法,該方法需要接收三個參數:

 public static Object newProxyInstance(ClassLoader loader,                     Class<?>[] interfaces,                     InvocationHandler h)    throws IllegalArgumentException

參數按順序解釋如下:

  • ClassLoader loader,:指定當前目標對象使用類加載器,獲取加載器的方法是固定的
  • Class[] interfaces,:目標對象實現的接口的類型,使用泛型方式確認類型
  • InvocationHandler h:事件處理,執行目標對象的方法時,會觸發事件處理器的方法,會把當前執行目標對象的方法作為參數傳入

代碼實現:

接口類IUserDao.java以及接口實現類,目標對象UserDao是一樣的,沒有做修改.在這個基礎上,增加一個代理工廠類(ProxyFactory.java),將代理類寫在這個地方,然后在測試類(需要使用到代理的代碼)中先建立目標對象和代理對象的聯系,然后代用代理對象的中同名方法。

代理工廠類ProxyFactory:

package net.ydstudio.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * @author Nick * @projectName javaLean * @package net.ydstudio.proxy * @createDate 2018/08/16 15:44 * @updateDate 2018/08/16 15:44 */public class ProxyFactory {  /**   * 維護一個代理的目標對象   */  private Object target;  public ProxyFactory(Object target){    this.target = target;  }  /**   * 給目標對象生成代理對象   * @param: []   * @return: java.lang.Object   */  public Object getProxyInstance(){    return Proxy.newProxyInstance(        target.getClass().getClassLoader(),        target.getClass().getInterfaces(),        new InvocationHandler() {          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {            System.out.println("開始事務2");            //執行目標對象方法            Object returnValue = method.invoke(target, args);            System.out.println("提交事務2");            return returnValue;          }        }    );  }}

測試類:

package net.ydstudio.proxy;import net.ydstudio.service.IUserDao;import net.ydstudio.service.impl.UserDao;import org.junit.Test;import org.junit.runner.RunWith;import org.junit.runners.JUnit4;import static org.junit.Assert.*;/** * @author Nick * @projectName javaLean * @package net.ydstudio.proxy * @createDate 2018/08/16 15:58 * @updateDate 2018/08/16 15:58 */@RunWith(JUnit4.class)public class ProxyFactoryTest {  @Test  public void test(){    // 目標對象    IUserDao target = new UserDao();    System.out.println(target.getClass());    // 給目標對象,創建代理對象    IUserDao proxy = (IUserDao)new ProxyFactory(target).getProxyInstance();    // class $Proxy()內存中動態生成的代理對象    System.out.println(proxy.getClass());    // 執行方法 代理對象    proxy.save();  }}

JDK實現代理總結:代理對象不需要實現接口,但是目標對象一定要實現接口,否則不能用動態代理。

總結

以上所述是小編給大家介紹的Java 中的三種代理模式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲91精品在线观看| 高潮白浆女日韩av免费看| 亚洲缚视频在线观看| 国产69久久精品成人| 国产欧美日韩精品专区| 久久综合国产精品台湾中文娱乐网| 91av在线视频观看| 国产成人97精品免费看片| 性色av一区二区咪爱| 国产精品欧美一区二区三区奶水| 色综合男人天堂| 中文字幕综合一区| 亚洲跨种族黑人xxx| 国产精品av在线播放| 一区二区在线视频| 欧美一级电影免费在线观看| 亚洲国产另类久久精品| 伊人激情综合网| 91久久久久久久久久久| 欧美性jizz18性欧美| 国产精品福利网| 中文字幕9999| 久久久精品影院| 国产在线播放不卡| 日韩视频一区在线| 日韩欧美精品在线观看| 另类图片亚洲另类| 日韩毛片在线观看| 自拍偷拍亚洲区| 亚洲精品美女久久久久| 午夜精品一区二区三区在线播放| 成人网欧美在线视频| 亚洲欧美制服第一页| 亚洲a成v人在线观看| 在线观看成人黄色| 国产亚洲成精品久久| 亚洲日本欧美中文幕| 国产精品久久久久久久久久东京| 亚洲成人在线网| 狠狠做深爱婷婷久久综合一区| 欧美电影免费观看高清完整| 精品国产精品三级精品av网址| 国产精品午夜视频| 96精品久久久久中文字幕| 久久这里有精品视频| 成人免费视频xnxx.com| 北条麻妃一区二区三区中文字幕| 一个色综合导航| 精品国产一区二区在线| 久久久综合av| 在线日韩精品视频| 欧美激情中文字幕在线| 国色天香2019中文字幕在线观看| 亚洲免费精彩视频| 深夜福利日韩在线看| 欧美体内谢she精2性欧美| 亚洲精选在线观看| 亚洲欧美中文字幕| 亚洲国产成人久久| 国产精品嫩草影院久久久| 欧美精品videofree1080p| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲最大福利视频网| 97精品一区二区视频在线观看| 欧美激情2020午夜免费观看| 91在线高清免费观看| 一本一道久久a久久精品逆3p| 亲爱的老师9免费观看全集电视剧| 麻豆一区二区在线观看| 黑人巨大精品欧美一区免费视频| 久久精品国产成人精品| 黄色精品在线看| 成人黄色av免费在线观看| 国产一区二区三区高清在线观看| 久久久这里只有精品视频| 91久久国产综合久久91精品网站| 亚洲精品国产精品国自产观看浪潮| 亚洲精品久久久久中文字幕二区| 欧美色视频日本版| 在线午夜精品自拍| 成人h猎奇视频网站| 清纯唯美亚洲综合| 亚洲精品电影网| 国产成人亚洲综合青青| 国产精品久久久久9999| 成人做爰www免费看视频网站| 精品国产视频在线| 久久综合久久美利坚合众国| 欧美一级在线亚洲天堂| 黄色成人av网| 性欧美xxxx交| 国产精品久久久久不卡| 91精品国产高清自在线| 亚洲国产欧美在线成人app| 国产剧情日韩欧美| 亚洲成人999| 亚洲午夜久久久影院| 亚洲国产成人爱av在线播放| 欧美综合一区第一页| 国内精品久久久久久影视8| 成人在线免费观看视视频| 亚洲综合大片69999| 欧美精品久久久久a| 91精品国产高清久久久久久久久| 欧美福利小视频| 久久av红桃一区二区小说| 国产欧美在线视频| 亚洲精品国产suv| 久久琪琪电影院| 丝袜美腿精品国产二区| 日韩中文视频免费在线观看| 成人网址在线观看| 97国产精品视频| 97免费视频在线播放| 亚洲第一福利视频| 国产盗摄xxxx视频xxx69| 国产伊人精品在线| 韩国精品美女www爽爽爽视频| 国产日本欧美在线观看| 日韩女优在线播放| 精品成人69xx.xyz| 国产深夜精品福利| 国产精品久久久久久婷婷天堂| 亚洲伦理中文字幕| 亚洲精品乱码久久久久久按摩观| 国产精品福利无圣光在线一区| 日本三级韩国三级久久| 国产一区二区三区久久精品| 日韩av在线影院| 国产精品伦子伦免费视频| 尤物99国产成人精品视频| 成人国产精品久久久久久亚洲| 深夜福利日韩在线看| 国产精品久久97| 欧美成人免费观看| 啪一啪鲁一鲁2019在线视频| 亚洲成人av在线| 久久不射电影网| 国产精品美乳在线观看| 国产一区二区激情| 欧美精品福利在线| 美女国内精品自产拍在线播放| 在线成人中文字幕| 91精品一区二区| 国产一区二区三区欧美| 午夜精品福利在线观看| 久久青草精品视频免费观看| 日韩在线免费观看视频| 欧美一级电影在线| 欧美日产国产成人免费图片| 久久亚洲精品视频| 97精品一区二区视频在线观看| 伊是香蕉大人久久| 亚洲高清福利视频| 亚洲人a成www在线影院| 亚洲va欧美va国产综合久久| 欧美极品少妇xxxxⅹ免费视频| 久久久国产精彩视频美女艺术照福利| 精品久久久久久久久久ntr影视| 亚洲自拍偷拍网址| 亚洲理论在线a中文字幕| 久久精品最新地址| 91在线精品播放| 国产精品久久久久久久久久尿|