如题

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

借鉴文章

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
*/
@Override
public 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
*/
@Override
public 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------------

《Java设计模式》之代理模式 -Java动态代理(InvocationHandler) -简单实现的更多相关文章

  1. Java设计模式-代理模式之动态代理(附源代码分析)

    Java设计模式-代理模式之动态代理(附源代码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的差别就是:动态代理是在执行时刻动态的创建出代理类及其对象. 上篇中的静态代 ...

  2. (转)轻松学,Java 中的代理模式及动态代理

    背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...

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

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

  4. 动态代理模式——JDK动态代理

    今天,我就来讲一下动态代理的设计模式. 动态代理的意义在于生成一个代理对象,来代理真实对象,从而控制真实对象的访问.操作动态代理需要两个步骤:一.代理对象和真实对象建立代理关系.二.实现代理对象的代理 ...

  5. Java的三种代理模式(Spring动态代理对象)

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...

  6. java代理模式及动态代理类

     1.      代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 ...

  7. Java代理模式之动态代理

    动态代理类的源码是程序在运行期间由JVM根据反射等机制动态生成的,所以不存在代理类的字节码文件.代理角色和真实角色的联系在程序运行时确定! Java中有两种动态代理,一种是JDK自带的,另一种的CGL ...

  8. 代理模式-jdk动态代理

    IDB package com.bjpowernode.proxy; /** * 代理类和目标类都必须使用同一个接口. */ public interface IDB { int insert(); ...

  9. 代理模式与动态代理之JDK实现和CGlib实现

    静态代理 静态代理中的代理类和委托类会实现同一接口或是派生自相同的父类. 由业务实现类.业务代理类 两部分组成.业务实现类 负责实现主要的业务方法,业务代理类负责对调用的业务方法作拦截.过滤.预处理, ...

  10. Java 中的代理模式及动态代理

    原文:https://blog.csdn.net/briblue/article/details/73928350

随机推荐

  1. JobStorage.Current property value has not been initialized. You must set it before using Hangfire Client or Server API.

    JobStorage.Current property value has not been initialized. You must set it before using Hangfire Cl ...

  2. 【Maven学习】定制库到Maven本地资源库

    目标:手工操作将一个jar安装到本地仓库 第一步:首先获取到jar包,可以是第三方的 也可以是自己创建的,放到本地任意目录 比如:joda-time-2.10.3,放到C:\jar\  目录下面 第二 ...

  3. Android MVP模式简单介绍:以一个登陆流程为例

    老的项目用的MVC的模式,最近完成了全部重构成MVP模式的工作,虽然比较麻烦,好处是代码逻辑更加清楚.简洁,流程更加清晰,对于后续版本迭代维护都挺方便.对于一些想要学习MVP模式的同学来讲,百度搜出来 ...

  4. SQL Server MERGE(合并)语句

    如何使用SQL Server MERGE语句基于与另一个表匹配的值来更新表中的数据.  SQL Server MERGE语句 假设有两个表,分别称为源表和目标表,并且需要根据与源表匹配的值来更新目标表 ...

  5. Redis中3种特殊的数据类型(BitMap、Geo和HyperLogLog)

    前言 Reids 在 Web 应用的开发中使用非常广泛,几乎所有的后端技术都会有涉及到 Redis 的使用.Redis 种除了常见的字符串 String.字典 Hash.列表 List.集合 Set. ...

  6. CentOS7-Docker容器入门

    Docker由三大部分组成 基础镜像---->中间件---->最后生成应用镜像一个镜像可以给多个进程使用! Docker是什么 Docker是一个改进的容器技术.具体的“改进”体现在,Do ...

  7. Idea Spring 、SpringBoot相关设置技巧

    1.Spring变量依赖注入出现红色波浪线 Could not autowire. No beans of 'UserMapper' type found. less... (Ctrl+F1) Che ...

  8. [Docker] - 使用 Kitematic 安装 elasticsearch 失败 之解决

    环境:Docker v19.03.4 + Kitematic Issue:(HTTP code 404) no such image - no such image: elasticsearch:la ...

  9. Java生产消费者模型——代码解析

    我们将生产者.消费者.库存.和调用线程的主函数分别写进四个类中,通过抢夺非线程安全的数据集合来直观的表达在进行生产消费者模型的过程中可能出现的问题与解决办法. 我们假设有一个生产者,两个消费者来共同抢 ...

  10. Delphi阿里云对象存储OSS【支持上传文件、下载文件、删除文件、创建目录、删除目录、Bucket操作等】

    作者QQ:(648437169) 点击下载➨Delphi阿里云对象存储OSS             阿里云api文档 [Delphi阿里云对象存储OSS]支持 获取Bucket列表.设置Bucket ...