Java代理模式——静态代理动态代理

proxy mode

  • 1. 什么是代理
    • 1.1 例子解释
    • 1.2 作用
  • 2. 静态代理
    • 2.1 优缺点分析
    • 2.2 以厂家卖u盘用代码说明
  • 3. 动态代理
    • 3.1 什么是动态代理
    • 3.2 jdk实现原理
    • 3.3 代码描述

1. 什么是代理

1.1 例子解释

1. 生活中的例子,常见的商家卖东西,
商家就是代理,工厂是目标,买东西的人是客户端。
买东西不能找厂家买东西,工厂不卖,得找商家,
商家在其中形成了代理。
2. 房东--租房中介--租房人也是上面的关系
3. 程序中代理表示:a类访问c类中的方法 但是c类不让a类访问 创建一个b代理 c让b访问

1.2 作用

1.功能增强 在原有的功能上 新增了额外的功能 , 新增的功能, 叫功能增强
2.控制访问 代理类不让你访问目标 如商家不让用户访问厂家
3.在项目中使用,使用别人的代码,在不改变原来目标方法功能的前提下, 
可以在代理中增强自己的功能代码

2. 静态代理

2.1 优缺点分析

	代理类是自己手工实现的,自己创建一个Java类,表示代理类。你所代理的目标是确定的,好理解	缺点: 目标类增多 代理类可能成倍增加 数量太多...接口中 增加功能后 会影响代理类多实现功能...

2.2 以厂家卖u盘用代码说明

  • 实现的功能
package com.lovely.static_proxy;// 功能 卖u盘
public interface UsbSell {// 卖usbfloat sell(int amount);}
  • 目标类 (a类)
package com.lovely.static_proxy;/*** 目标类  * @author echo lovely**/
public class Factory implements UsbSell {// 每个u盘卖10元@Overridepublic float sell(int amount) {System.out.println("工厂卖u盘");return 10.0f;}}
  • 淘宝代理类(代理b1)
package com.lovely.static_proxy;/*** 淘宝代理类 代理工厂 * @author echo lovely**/
public class TaoBao implements UsbSell {private Factory factory = new Factory();// 代理工厂@Overridepublic float sell(int amount) {// 多卖了 15.0f 功能增强1float price = factory.sell(amount) + 15.0f;// 功能增强2System.out.println("淘宝返回优惠券");return price;}}
  • 微商代理 (代理b2)
package com.lovely.static_proxy;public class WeiSolder implements UsbSell {private Factory f = new Factory();@Overridepublic float sell(int amount) {return f.sell(amount) + 1.0f;}}
  • 客户端(a类)
package com.lovely.static_proxy;public class BuyMain {/*** 缺点 会创建许多代理对象* 如果 目标很多 代理对象很多* 目标增加 代理改变...* @param args*/public static void main(String[] args) {// 通过代理类 实现买you盘 增加了 买you盘 和 优惠券...TaoBao tb = new TaoBao();float price = tb.sell(10);System.out.println("经过代理taobao 价格 " + price);WeiSolder w = new WeiSolder();price = w.sell(10);System.out.println("经过代理微商 价格 " + price);}}

3. 动态代理

3.1 什么是动态代理

	概念在程序执行过程中,使用jdk的反射机制,创建代理类对象(无需写代理类了),并动态的指定要代理目标类(厂家)。又 : 动态代理是一种创建Java对象的能力,让你不用创建代理类,就能创建代理类对象。代理目标是活动的,可设置的给不同的目标随时创建代理
	优点:解决静态代理的弊端在静态代理中目标类很多的时候 可使用动态代理 修改接口中的方法 不会影响代理类		

3.2 jdk实现原理

要求:jdk的动态代理 目标类与代理类必须实现相同的接口,才可代理jdk动态代理实现:InvocationHandler: 只有一个invoke()方法,里面写代理类实现的功能 1. 调用目标类方法 2. 实现功能增强public Object invoke(Object proxy, Method method, Object[] args)InvocationHandler 接口:表示你的代理要干什么。使用: 1. 创建类实现接口 InvocationHandler2. 重写invoke方法,把原来静态代理中代理类要完成的功能写在invoke中Method 类 method.invoke(目标对象,"参数值")Proxy 类 使用proxy类的方法 表示创建对象 代替newProxy.newProxyInstance(more args...); 创建代理对象public static Object newProxyInstace(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)代理目标类, 创建代理类对象(返回值)参数1. ClassLoader loader 类加载器,负责向内存中加载对象。目标对象的类加载器。a.getClass().getClassLoader()2. Class<?>[] interfaces 目标对象实现的接口3. InvocationHandler 代理类要完成的功能

3.3 代码描述

  • 功能接口
package com.lovely.dynamite_proxy;// 实现卖u盘功能
public interface UsbSell {public abstract float sell(int amount);}
  • 目标类
package com.lovely.dynamite_proxy;public class UsbKingFactory implements UsbSell {@Overridepublic float sell(int amount) {System.out.println("工厂实现卖u盘,每个" + 10.0f);return 10.0f;}}
  • 代理类要干什么(实现目标||功能增强)
package com.lovely.dynamite_proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;/*** 代理类所实现的功能* @author echo lovely**/
public class MyInvocationHandler implements InvocationHandler {// 目标对象private Object target = null;public MyInvocationHandler(Object target) {this.target = target;}// 此方法 实现目标(卖u盘) 和 实现功能增强public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 调用目标对象target的 方法 Object returnValue = method.invoke(target, args);if (target !=  null) {float price = (float) returnValue;// 多卖20元price += 20.0f;returnValue = price;}System.out.println("这里调用目标方法,还可做其它操作,如写一些其它功能");return returnValue;}}
  • 创建代理对象,实现动态代理需求
package com.lovely.dynamite_proxy;import java.lang.reflect.Proxy;public class BuyMain {public static void main(String[] args) {// 创建目标对象UsbSell usbKing = new UsbKingFactory();// 创建实现目标 功能类MyInvocationHandler handler = new MyInvocationHandler(usbKing);// System.out.println(UsbKingFactory.class.getInterfaces()[0].getName());// System.out.println(UsbKingFactory.class.getClassLoader());// 创建代理对象UsbSell proxy = (UsbSell)Proxy.newProxyInstance(UsbKingFactory.class.getClassLoader(), UsbKingFactory.class.getInterfaces(), handler);float price = proxy.sell(1);System.out.println("价格为 " + price);}}
工厂实现卖u盘,每个10.0
这里调用目标方法,还可做其它操作,如写一些其它功能
价格为 30.0
  • 关于动态代理另一种实现cglib
cglib(code generating libray)动态代理: 第三方的工具库 创建代理对象原理是继承: cglib通过继承目标类 创建子类 重写方法 对功能修改对于无接口的类 使用cglib实现cglib在spring mybatis中使用较多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一、Insertion sort

1. 问题 2. 算法 2.1 伪代码 2.2 算法思想 2.3 手工演示 2.4 Python实现 《算法导论》一书数组默认从111开始&#xff0c;这种方式适合算法分析&#xff0c;从000开始适合程序实现&#xff0c;为了能和伪代码一致便于对比&#xff0c;后边所有的Python实现中数组均从111开始。…

windows 2502 2503 错误解决

1. 错误原因 1. c盘下temp文件夹权限问题 2. c盘temp文件夹环境变量配置错误&#xff0c;或者更改了2. 造成的问题 每次安装msi文件或者卸载msi程序包时&#xff0c;都会弹出此恶心的错误...3. 解决 1. 针对问题一&#xff0c;解决&#xff0c;以管理员身份安装或者卸载 win…

Hibernate学习笔记

Hibernate是什么&#xff1a; Hibernate 架构&#xff1a; 下载、安装、必要的 jar包、环境CLASSPAST的设置&#xff08;此步骤省略&#xff09; Hibernate框架的使用步骤&#xff1a;1、创建Hibernate的配置文件&#xff08;hibernate.cfg.xml&#xff09;2、创建持久化类&…

二、Merge sort

1 问题 2 算法 2.1 伪代码 2.2 算法思想 2.3 手工演示 2.4 Python实现 # -*- coding: utf-8 -*- import sysdef merge(A, p, q, r):n1 q - p 1n2 r - qL [0] * (n1 2)R [0] * (n2 2)for i in range(1, n11):L[i] A[pi-1]for j in range(1, n21):R[j] A[qj]L[n11] 6…

cglib实现动态代理

对目标方法实现前置或者后置增强&#xff0c; 是在程序动态运行时加入增强方法的。 1. 目标类 package com.lovely.proxy.cglib;/*** 目标类* author echo lovely* date 2020/7/26 15:20*/ public class Target {public void save() {System.out.println("sve running..…

fragment嵌套,viewpager嵌套 不能正确显示

转帖&#xff1a;http://blog.csdn.net/mybook1122/article/details/24003343 通常为 viewPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager(), fragmentsList)); 替换为 mPager.setAdapter(new MyFragmentPagerAdapter(getChildFragmentManager(), fra…

三、递归树分析法

1 问题 2 解决思路 使用递归树猜想一个上界&#xff0c;使用归纳法证明上界也是下界。 2.1 使用递归树&#xff08;recursion tree&#xff09;猜想结论&#xff08;不严谨&#xff09; 使用递归树两点&#xff1a;1⃣️逐行展开&#xff1b;2⃣️逐行相加&#xff1b; 逐行…

Linux文件查看/编辑方法介绍

转载:https://www.centos.bz/2011/10/linux-file-view-edit/ cat 命令介绍 cat 命令的原含义为连接(concatenate)&#xff0c; 用于连接多个文件内容并输出到标准输出流中&#xff08;标准输出流默认为屏幕&#xff09;。实际运用过程中&#xff0c;我们常使用它来显示文件内容…

html5input表单标签新属性

初探h5一&#xff0c;h5 新增表单类型二&#xff0c;新增表单属性三&#xff0c;code demo一&#xff0c;h5 新增表单类型 •email 邮箱地址•url 网络地址•number 数字框•range 滑块•Date pickers (date, month, week, time, datetime, datetime-local) 日期时间框•search…

关于java的JIT知识

1.JIT的工作原理图 工作原理 当JIT编译启用时&#xff08;默认是启用的&#xff09;&#xff0c;JVM读入.class文件解释后&#xff0c;将其发给JIT编译器。JIT编译器将字节码编译成本机机器代码。 通常javac将程序源码编译&#xff0c;转换成java字节码&#xff0c;JVM通过解释…

Storage 使用

关于web项目数据存储1. 存储种类2. localStorage/sessionStorage2.1 概念2.2 api的使用3. 学生curd测试localStorage针对客户端存储讲 ——storage1. 存储种类 1. 分为服务器端和客户端的存储 2. 服务器端&#xff1a;1. 内存存储(临时)application session request pageConte…

信息抽取--新词提取

&#xff08;纯属为了记录自己学习的点滴过程&#xff0c;引用资料都附在参考列表&#xff09; 1 基本概念 什么是新词&#xff08;是什么&#xff09; 新词是一个相对的概念&#xff0c;每个人的标准都不一样&#xff0c;所以我们这里定义: 词典之外的词语(OOV)称作新词。 …

spring 基于xml方式配置aop

目录什么是aop模拟aop配置什么是aop 什么是aop 作用 在程序运行期间&#xff0c;在不修改源码的情况下对方法进行功能增强 优势 减少重复代码 提高开发效率 并且便于开发2.aop关键概念 模拟aop 目标接口 package com.lovely.proxy.aop;public interface TargetInterface …

word2vec相关资料

blogs&#xff1a; http://www.douban.com/note/323504583/ and http://www.zhihu.com/question/21661274 references: http://arxiv.org/pdf/1310.4546v1.pdf and http://www.fit.vutbr.cz/research/groups/speech/servite/2010/rnnlm_mikolov.pdf转载于:https://www.cnblogs…