【设计模式-代理模式】
时间:2022-07-24
本文章向大家介绍【设计模式-代理模式】,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
【导读】很多场景需要一个中介去完成,例如租房,找工作等。中介会帮你去完成一些其他操作,比如准备合同、与第三方对接等等。此时就需要用到代理模式。
其实Java的动态代理以及spring的CGLib就是用的此模式。
一、定义
为其他对象提供一种代理,以控制对这个对象的访问。比如某些对象的创建比较耗时,就可以使用代理,也可以使用享元模式。
二、实例
有两种方式,一种是静态代理,一种是动态代理。
(1)静态代理
说白了就是在方法执行前后生硬的加上其它处理逻辑。就类似下列代码,在订单保存的前后进行相应的逻辑处理。
public class StaticOrderProxy {
private OrderService orderService;
public StaticOrderProxy(OrderService orderService) {
this.orderService = orderService;
}
public int saveOrder(Order order) {
System.out.println("保存订单之前的处理逻辑");
int orderId = orderService.saveOrder(order);
System.out.println("保存订单之后的处理逻辑");
return orderId;
}
}
静态代理不适合开闭原则,基本没有扩展性。
(2)动态代理
以JDK的动态代理为例,其代理的类是需要继承接口的,否则会报错。
之前专门有一篇【JDK动态代理源码分析】,感兴趣的可以看一下。
1、必须要有一个类实现InvocationHandler接口
public class DynamicOrderProxy implements InvocationHandler {
Object target;
public DynamicOrderProxy(Object target) {
this.target = target;
}
//生成代理类
public Object bind(){
Class<?> aClass = target.getClass();
return Proxy.newProxyInstance(aClass.getClassLoader(),aClass.getInterfaces(),this);
}
/**
* @param proxy 动态代理实例
* @param method 需要执行的方法
* @param args 方法中参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("保存订单之前的逻辑");
Object result = method.invoke(target, args);
System.out.println("保存订单之前的逻辑");
return result;
}
}
2、需要代理的类
1、接口
public interface OrderService {
int saveOrder(Order order);
void test(String a);
}
2、实现类,需要代理的类
public class OrderServiceImpl implements OrderService {
private OrderDao orderDao ;
public OrderServiceImpl() {
}
public OrderServiceImpl(OrderDao orderDao) {
this.orderDao = orderDao;
}
@Override
public int saveOrder(Order order) {
orderDao = new OrderDaoImpl();
return orderDao.saveOrder(order);
}
}
3、测试类
OrderService orderService = (OrderService) new DynamicOrderProxy(new OrderServiceImpl()).bind();
Order order = new Order();
order.setOrderId("测试订单号");
orderService.saveOrder(order);
运行结果:
代理模式比较简单。
三、源码实例
(1)JDK动态代理
(2)Spring的AOP
- 用户登录安全框架shiro—用户的认证和授权(一)
- 第一道防线__SpringMVC配置拦截器
- Web层框架对网站中所有异常的统一处理
- Spring MVC__自定义日期类型转换器
- 解决在控制层springmvc框架发出的400状态的错误
- 解决springmvc在单纯返回一个字符串对象时所出现的乱码情况(极速版)
- MySQL日志文件之错误日志和慢查询日志详解
- 采用HTML5之"data-"机制自由提供数据
- Spring和SpringMVC父子的容器之道---[上篇]
- 快速完成(图片旋转,查看原图)
- Jsp中格式化时间戳的常用标签
- 反射+自定义注解---实现Excel数据列属性和JavaBean属性的自动映射
- 后台模板管理系统___左侧菜单数据的异步加载
- Shiro眼皮下玩ajax,玩出302 Found
- 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 数组属性和方法
- Yii Framework框架使用PHPExcel组件的方法示例
- thinkphp3.2.3框架动态切换多数据库的方法分析
- 安装docker和docker-compose实例详解
- 如何判断php复选框是否被选中
- php实现的生成排列算法示例
- php多进程应用场景实例详解
- Linux Crontab Shell脚本实现秒级定时任务的办法
- laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
- yii框架使用分页的方法分析
- Linux服务器间文件实时同步的实现
- TP3.2.3框架文件上传操作实例详解
- yii2.0框架场景的简单使用示例
- Laravel5.6框架使用CKEditor5相关配置详解
- 怎么在Linux中自定义bash命令提示符
- Hbase入门详解