设计模式之代理模式
时间:2020-04-16
本文章向大家介绍设计模式之代理模式,主要包括设计模式之代理模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
代理模式通常分为静态代理和动态代理两种。
- 静态代理
静态代理
public interface StaticSourceable { public void doMethod(); } public class StaticSource implements StaticSourceable { public void doMethod() { System.out.println("业务处理。。。"); } } public class StaticProxy implements StaticSourceable { StaticSource source; public StaticProxy() { // 在代理类的无参构造器中创建目标对象 this.source = new StaticSource(); } // 代理类对StaticSource的doMethod方法做了增强 public void doMethod() { before(); try { source.doMethod(); } catch (Exception e) { exception(); } after(); } public void before() { System.out.println("进入方法。。。"); } public void after() { System.out.println("执行结束。。。"); } public void exception() { System.out.println("出现异常。。。"); } public static void main(String[] args) { StaticSourceable source = new StaticProxy(); source.doMethod(); } }
- 动态代理
动态代理又分为JDK动态代理和CGLib动态代理。
- JDK动态代理
JDK动态代理
// 目标类接口 public interface IMyJDKTarget { void doMethod(); } // 目标类 public class MyJDKTargetImpl implements IMyJDKTarget { public void doMethod() { System.out.println("业务处理。。。"); } } // 代理类 public class JDKProxyFactory implements InvocationHandler { // 目标对象 private Object target; public JDKProxyFactory(Object target) { super(); this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { before(); // 调用目标对象方法 Object object = method.invoke(target, args); after(); return object; } public Object getProxy() { // 直接调用java.lang.reflect.Proxy的静态方法newProxyInstance return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } public void before() { System.out.println("进入方法。。。"); } public void after() { System.out.println("执行结束。。。"); } public static void main(String[] args) { IMyJDKTarget target = (IMyJDKTarget) new JDKProxyFactory(new MyJDKTargetImpl()).getProxy(); target.doMethod(); } }
- CGLib动态代理
CGLib动态代理
// 目标类(不需要接口) public class MyCgLibTarget { public void doMethod() { System.out.println("业务处理。。。"); } } // 代理类 public class CgLibProxyFactory implements MethodInterceptor { // 目标对象 private Object target; public CgLibProxyFactory(Object target) { super(); this.target = target; } public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { before(); // 调用目标对象方法 Object object = proxy.invoke(target, args); after(); return object; } public Object getProxy() { // 创建增强器 Enhancer enhancer = new Enhancer(); // 设置需要增强的类的类对象 enhancer.setSuperclass(target.getClass()); // 设置回调函数 enhancer.setCallback(this); // 获取增强之后的代理对象 return enhancer.create(); } public void before() { System.out.println("进入方法。。。"); } public void after() { System.out.println("执行结束。。。"); } public static void main(String[] args) { MyCgLibTarget target = (MyCgLibTarget) new CgLibProxyFactory(new MyCgLibTarget()).getProxy(); target.doMethod(); } }
原文地址:https://www.cnblogs.com/scorpio-cat/p/12715222.html
- 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 数组属性和方法
- C# dotnet 使用 startIndex 提升 IndexOf 的性能
- vscode .vue文件格式配置 使其与webstorm设置一致
- Go 语言学习之 slice
- koa2实现微信公众号关注自动回复消息
- 两个字数字字符串求和
- 设计模式(二):Android 源码中的工厂模式
- MoveIt!之ROS1Melodic版本发布(MoveItCpp教程)
- 机器学习第1天:线性回归(代码篇)
- PHP二分查找
- OnClick 的另一种书写
- JVM系列之:JIT中的Virtual Call
- 速读原著-UnixLinux基础(五)
- Celery在Django中的简单应用
- 基于数据库Binlog 的业务系统操作日志实现方案(阿里中间件Canal)
- 速读原著-UnixLinux基础(三)