09 设计模式 动态代理
时间:2022-07-22
本文章向大家介绍09 设计模式 动态代理,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
动态代理
之前学习过静态代理,发现有个缺点,每当需要代理一个类就需要创建与之相当的代理类,极大的增加了代码量。现在通过动态代理,可以通过极少的代码量实现所要的功能
动态代理与静态代理拥有一样的角色:
抽象角色
、真实角色
、代理角色
首先定义一个抽象角色
public interface Rent {
public void rent();
}
再定义一个真实角色
public class Landlord implements Rent{
@Override
public void rent() {
System.out.println("出租房屋");
}
}
最后创建代理类
public class ProxyInvocationHandler implements InvocationHandler{
Rent rent;//抽象代理类
public void setRent(Rent rent) {
this.rent = rent;
}
/*获取代理对象*/
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(), this);
}
/*实现步骤*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(rent, args);
}
}
测试代码
public static void main(String[] args) {
ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler();
proxyInvocationHandler.setRent(new Landlord());
Rent rent = (Rent) proxyInvocationHandler.getProxy();
rent.rent();
}
测试结果如下
出租房屋
将上面的动态代理类修改一下,成为一个可以复用的类似工具类的类
public class ProxyInvocationHandler implements InvocationHandler{
Object target;
public void setRent(Object target) {
this.target = target;
}
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return method.invoke(target, args);
}
}
- Nodejs学习笔记(四)——支持Mongodb
- 语音识别类产品的分类及应用场景
- 小程序新能力-个人开发者尝鲜微信小程序
- 径向基神经网络续1
- 打造你的专属AI游戏机器人:太空侵略者
- WCF后续之旅(16): 消息是如何分发到Endpoint的--消息筛选(Message Filter)
- 最高大上的展览!腾讯建了一个小“方盒子”,里面全是高科技
- Blend基础-布局控件
- Spring实战——缓存
- Nodejs学习笔记(十二)--- 定时任务(node-schedule)
- Spring实战——缓存
- Spring实战——缓存
- 今天,微信紧急发布小程序最强入口!这3项新能力堪称年度豪礼!
- Python基础知识梳理-第01部分
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- AndroidStdio1_4
- 130. 被围绕的区域 Krains 2020-08-11 10:50:01 并查集DFS
- scRNA-seq Clustering(二)
- Apache-Hive 使用MySQL存储Hive的元数据
- 使用TensorFlow创建能够图像重建的自编码器模型
- Qt音视频开发9-ffmpeg录像存储
- AntDesignPro使用electron构建桌面应用
- 跨域资源共享
- AndroidStdio1_3
- Rancher2.4.3 Rest API修改镜像地址
- Python UNIX系统管理指南
- 聊聊dubbo-go的ConsistentHashLoadBalance
- Tacotron2运行笔记
- 小米底包
- 新特性解读 | GROUPING() 函数用法解析