如题

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

借鉴文章

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. Gerrit - 安装配置GitWeb

    1 - GitWeb简介 GitWeb是一个支持在Web页面上查看代码以及提交信息的工具. 安装GitWeb工具并且集成到Gerrit中,就可以直接在Gerrit的项目列表中查看项目的代码信息. 2 ...

  2. ThinkPHP3开发模式,控制器操作,配置文件,框架语法

    ThinkPHP的开发模式 tp框架有两种使用模式:开发模式(调试模式),一种是生产模式(运行模式) define('APP_DEBUG', true);  //调试模式 define('APP_DE ...

  3. 一致性hash算法应用场景、详解与实现(JAVA)

    一.概述 在分布式环境下,开发者通常会遇到一些分布存储的场景,例如数据库的分库分表(比如用户id尾号为1的放入数据库1,id尾号为2的放入数据库2):又如分布式缓存数据的获取(比如根据ip地址进行缓存 ...

  4. SQLite接口函数 - C核心api实践与总结

    SQLite核心源代码由C语言写就,同时提供了很多的扩展包可应用于其他编程语言和类库,如Python.Ruby.Java.Perl..Net/C#.Qt和ODBC.在很多情况下,针对一种语言有很多扩展 ...

  5. netcore 实现跨应用的分布式session

    需求场景 网站a,域名为 a.site.com 网站b, 域名为 b.site.com 需要在a.b两个站点之间共享session 解决方案 使用redis作为分布式缓存存储 设置sessionId ...

  6. 2019 房多多java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.房多多等公司offer,岗位是Java后端开发,因为发展原因最终选择去了房多多,入职一年时间了,也成为了面试官 ...

  7. rename file

    https://askubuntu.com/questions/790633/the-o-parameter-in-aria2c-cant-rename-the-downloaded-file You ...

  8. 重要知识点angularjs $http.get 和 $http.post 传递参数(!!!格式不一样!!!!)

    $http.get请求数据的格式 $http.get(URL,{ params: { "id":id } }) .success(function(response, status ...

  9. MES实施会有哪些情况?为你介绍两种常见的类型

    MES项目实施顾问是一份极具挑战的工作,需具备大量的专业知识,以及丰富的实施经验.今天,小编为大家介绍最常见的两种MES实施顾问类型,希望对大家有所启发. 保姆型实施顾问 是指以实施顾问为主导,只要是 ...

  10. 【OGG】OGG的单向复制配置-支持DDL(二)

    [OGG]OGG的单向复制配置-支持DDL(二) 一.1  BLOG文档结构图 一.2  前言部分 一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的 ...