如题

  • 代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
  • 代理模式可细分为如下, 本文不做多余解释
  • 远程代理
  • 虚拟代理
  • 缓冲代理
  • 保护代理

借鉴文章

https://www.cnblogs.com/java-my-life/archive/2012/04/23/2466712.html
《Java设计模式》 -Java动态代理(InvocationHandler)

AbstractUserDAO 抽象的用户DAO类, 抽象主题角色

package proxy;/*** @description  抽象的用户DAO类, 抽象主题角色* @Date 2019/6/22 10:05*/
public interface AbstractUserDAO {Boolean findUserById(Long userId);
}

UserDAO 用户DAO类,具体主题角色

package proxy;/*** @description 类的详细说明: 用户DAO类,具体主题角色* @Date 2019/6/22 10:08*/
public class UserDAO implements AbstractUserDAO{/*** 简单举个栗子,实际应用时自行调整* @param userId* @return*/@Overridepublic Boolean findUserById(Long userId) {Long maxx =new Long( "10000000");if(userId>=1 && userId<=maxx){System.out.println("查询ID为 "+userId+" 的用户信息成功!");return true;}else{System.out.println("查询ID为 "+userId+" 的用户信息失败");return false;}}
}

DAOLogHandler 自定义请求处理程序, 前后打印日志

package proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.GregorianCalendar;/*** @description  自定义请求处理程序,实现前置和后置通知, 及前后打印日志* @Date 2019/6/22 10:15*/
public class DAOLogHandler implements InvocationHandler {/**calendar 属性用于打印时间*/private Calendar calendar;private Object object;/*** 自定义有参构造器,用以注入一个需要提供代理的真实主题对象* @param object 代理对象*/public DAOLogHandler(Object object) {this.object = object;}/*** @param proxy 需要代理的类* @param method 需要代理的方法* @param args 代理方法的参数数组* @return* @throws Throwable*/@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {beforeInvoke();/**转发调用*/Object result = method.invoke(object,args);afterInvoke();return result;}/*** 实现前置通知处理*/private void beforeInvoke(){//使用当前时间构造默认的<code>GregorianCalendar类</code> ,在默认时区, 使用默认值calendar = new GregorianCalendar();int hour = calendar.get(Calendar.HOUR_OF_DAY);int minute = calendar.get(Calendar.MINUTE);int second = calendar.get(Calendar.SECOND);System.out.println("------------调用时间 "+hour+":"+minute+":"+second+"------------");}/*** 实现后置通知处理*/private void afterInvoke(){calendar = new GregorianCalendar();int hour = calendar.get(Calendar.HOUR_OF_DAY);int minute = calendar.get(Calendar.MINUTE);int second = calendar.get(Calendar.SECOND);System.out.println("------------调用方法结束 "+hour+":"+minute+":"+second+"------------\n");}
}

Client 主要测试类

package proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;/*** 客户端类, 主要测试类** 题目描述: 某公司要为公司的OA(办公自动化)系统的数据访问层DAO增加方法调用日志,*          记录每一个方法被调用的时间和调用结果,现使用动态代理(InvocationHandler)进行设计和实现.*/
public class Client {public static void main(String[] args) {InvocationHandler handler = null;AbstractUserDAO userDAO = new UserDAO();/**初始化调用处理器*/handler = new DAOLogHandler(userDAO);AbstractUserDAO proxy=null;//动态创建代理对象// Proxy.newProxyInstance : 返回指定接口的代理类的实例,该接口将方法调用分派给指定的调用处理程序。proxy = (AbstractUserDAO) Proxy.newProxyInstance(AbstractUserDAO.class.getClassLoader(),new Class[]{AbstractUserDAO.class},handler);proxy.findUserById((long)001);proxy.findUserById((long)999999999);}
}

测试输出


------------调用时间 10:59:25------------
查询ID为 1 的用户信息成功!
------------调用方法结束 10:59:25------------------------调用时间 10:59:25------------
查询ID为 999999999 的用户信息失败
------------调用方法结束 10:59:25------------

转载于:https://www.cnblogs.com/zhazhaacmer/p/11068254.html

《Java设计模式》之代理模式 -Java动态代理(InvocationHandler) -简单实现相关推荐

  1. Java篇 - 代理模式和动态代理实现原理

    设计模式中有一种模式叫代理模式,Spring框架离不开动态代理技术,Android hook技术用到了反射 + 动态代理,Framework中我们也经常看到各种proxy,如ApplicationTh ...

  2. Java内功修炼系列:代理模式及动态代理

    目录 一 代理模式 1.1 简介 1.2 代理模式角色定义 二 静态代理 2.1 介绍和实例 2.2 静态代理的缺点 三 动态代理 3.1 基于JDK原生动态代理实现 四 小结 一 代理模式 1.1 ...

  3. Java拾遗:007 - 代理模式与动态代理

    2019独角兽企业重金招聘Python工程师标准>>> 代理模式 在日常开发中我们可以会接手一些老的项目,有时连源码都没有,或者有时候我会需要对业务逻辑做一定增强(功能扩展,如:日志 ...

  4. 【设计模式】--- 装饰器模式、静态代理模式和动态代理模式

    文章目录 1 引子 2 业务场景介绍 3 静态代理模式 4 装饰器模式 5 动态代理模式 5.1 Proxy --- 具体的代理对象生成组件 5.2 InvocationHandler --- 封装被 ...

  5. 设计模式—代理模式以及动态代理的实现

    代理模式(Proxy Design Pattern)是为一个对象提供一个替身,以控制对这个对象的访问.即通过代理对象访问目标对象.被代理的对象可以是远程对象.创建开销大的对象或需要安全控制的对象. 一 ...

  6. 代理模式和动态代理模式_代理模式介绍

    代理模式和动态代理模式 代表:被选中或当选为他人投票或代理的人– Merriam-Webster . 委托模式:在软件工程中,委托模式是面向对象编程中的一种设计模式,其中,一个对象而不是执行其陈述的任 ...

  7. 代理模式、动态代理和面向方面

    代理的意思很好理解,它借鉴了我们日常所用的代理的意思:就是本来该自己亲自去做的某件事,由于某种原因不能直接做,而只能请人代替你做,这个被你请来做事的人就是代理.比如过春节要回家,由于你要上班,没时间去 ...

  8. 20171030_chr_proxy 代理模式(动态代理)

    代理模式(动态代理) /20171030_chr_proxy/src/nuc/sw/dynamic/proxy/Dog.java package nuc.sw.dynamic.proxy;public ...

  9. java动态代理_Java代理模式及动态代理详解

    Java的动态代理在实践中有着广泛的使用场景,比如最场景的Spring AOP.Java注解的获取.日志.用户鉴权等.本篇文章带大家了解一下代理模式.静态代理以及基于JDK原生动态代理. 代理模式 无 ...

  10. JAVA代理模式与动态代理模式

    1.代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用. 代理模式给 ...

最新文章

  1. 您如何确定以编程方式发送的电子邮件不会自动标记为垃圾邮件?
  2. Python:zip()函数
  3. MySQL中的show full columns from 表名
  4. Java多线程的上下文切换
  5. C#中的线程(一)入门
  6. pycharm多行代码同时注释、去除注释
  7. 悟道web标准:前端性能优化
  8. CMD恶搞命令集,假装自己是黑客
  9. php鼠标指针,在windows中鼠标指针呈四箭头时一般表示什么
  10. DDR和LPDDR、LPDDR4和LPDDR4X的区别 LPDDR5
  11. 问题 F: 小明与隔壁老王之间不得不说的故事
  12. 网易设计师:交互设计要承担的8大工作职能
  13. 信号完整性(SI)电源完整性(PI)学习笔记(十七)传输线的串扰(一)
  14. SUNDIALS中的RTOL和ATOL
  15. linux下kbhit的头文件,linux下kbhit()使用
  16. LeetCode1219 黄金矿工
  17. 计算机软件工程专业,计算机软件工程专业
  18. 新iPhone9月登场, 5大特色浮出水!
  19. Windows笔记本移动热点打不开
  20. 从中医角度体检健身标准

热门文章

  1. 基于Redis的三种分布式爬虫策略
  2. JDRefresh 轻简下拉刷新框架
  3. Exchange 2016之用EMS配置全局OWA语言和时区设置
  4. apache编译出错 error: mod_deflate has been requested
  5. 如何优雅的调用第三方接口
  6. 程序员翻车时的 30 种常见反应!第21个深有感触...
  7. 史上最便捷搭建RocketMQ服务器的方法
  8. 牛逼!这么问 OutOfMemoryError 能让我懵逼!
  9. mnist数据集_探索Tensorflow2中神经网络算法——基于Mnist数据集(一)
  10. linux进阶之Tomcat服务篇