国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳解Java 中的三種代理模式

詳解Java 中的三種代理模式

2021-05-26 12:16ydstudio Java教程

代理(Proxy)是一種設計模式,提供了對目標對象另外的訪問方式;這篇文章主要介紹了Java 中的三種代理模式,需要的朋友可以參考下

代理模式

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

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

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

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

靜態代理

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

實例說明:

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

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

接口:iuserdao.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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("結束保存數據……");
  }
}

測試類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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方法,該方法需要接收三個參數:

?
1
2
3
4
public static object newproxyinstance(classloader loader,
                    class<?>[] interfaces,
                    invocationhandler h)
   throws illegalargumentexception

參數按順序解釋如下:

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

代碼實現:

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

代理工廠類proxyfactory:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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;
          }
        }
    );
  }
}

測試類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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 中的三種代理模式,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:https://www.ydstudio.net/archives/82.html

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 精品视频一区二区 | 精品一区二区三区免费 | 国产一区二区三区四区 | 久久人人爽爽爽人久久久 | 国外成人在线视频 | 99久久久国产精品 | 亚洲高清视频在线 | 日韩中文一区二区三区 | 国产中文字幕一区 | 毛片免费在线播放 | 久久久人成影片免费观看 | 高清一区二区三区 | 欧美精三区欧美精三区 | 一区亚洲 | 新91在线| 国产成人精品免高潮在线观看 | 亚洲狠狠爱 | 成人在线观看免费 | 亚洲精品在线观看av | 国产区一区 | 成人av片在线观看 | 青青草视频在线免费观看 | 国产嫩草91 | 91久久精品一区二区二区 | 99久久精品国产毛片 | 欧美狠狠干 | 国产黄色成人 | 在线成人小视频 | 久久综合久色欧美综合狠狠 | 国产乱码久久久久久一区二区 | 国产福利在线观看 | 无毛网站| 国产精品一区二区免费 | 中文字幕欧美日韩 | 性做久久久久久久久 | 午夜在线观看视频 | 在线黄av| 三级视频在线 | 精品日韩一区 | 日本一区免费 | 国产成人久久精品一区二区三区 |