代理模式

  代理(Proxy)是一种设计模式, 提供了对目标对象另外的访问方式;即通过代理访问目标对象。

  这样好处: 可以在目标对象实现的基础上,增强额外的功能操作。(扩展目标对象的功能)。

代理模式的关键点: 代理对象与目标对象。

aaarticlea/png;base64,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" alt="" width="443" height="196" />

动态代理,

1)代理对象,不需要实现接口;

2)代理对象的生成,是利用JDKAPI, 动态的在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型;);

3)  动态代理也称 JDK代理和接口代理;

JDK中生成代理对象的API:

|-- Proxy

static Object newProxyInstance(

ClassLoader loader,       指定当前目标对象使用类加载器

Class<?>[] interfaces,     目标对象实现的接口的类型

InvocationHandler h       事件处理器

)

代码示例:

1、目标对象须实现的接口
package org.fkjava.b_dynamic;
public interface IUserDao {

    void save();
}
2、目标对象,实现接口
package org.fkjava.b_dynamic;
public class UserDaoImpl implements IUserDao{ @Override
public void save() {
System.out.println("-----已保存数据-----");
} }
3、使用代理工厂,生产代理对象
package org.fkjava.b_dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* 这是一个代理工厂,用来生产代理对象
* 给所有的dao创建代理对象[动态代理]
* 代理对象不需要实现接口
*/
public class ProxyFactory { //通过构造器维护一个目标对象,这里用Object,表示可以给所有的目标对象生产代理对象
private Object target;
public ProxyFactory(Object target){
this.target = target;
} // 给目标对象,生成代理对象
public Object getProxyInstance(){
return Proxy.newProxyInstance(
target.getClass().getClassLoader(), //当前目标对象使用类加载器
target.getClass().getInterfaces(), //目标对象要实现的接口的类型
new InvocationHandler() { //事件处理器 @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable { System.out.println("开启事务"); //执行目标对象方法
Object returnValue = method.invoke(target, args); System.out.println("提交事务"); return returnValue;
}
});
}
}
4、测试动态代理类
package org.fkjava.b_dynamic;
public class Test_dynamic {
public static void main(String[] args) {
//目标对象
IUserDao target = new UserDaoImpl();
System.out.println(target.getClass());//【原始的类型 class cn.itcast.b_dynamic.UserDao】 //通过代理工厂给目标对象创建代理对象
//proxy对象是在内存中生成的代理对象
IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
System.out.println(proxy.getClass());// class $Proxy0   内存中动态生成的代理对象 //执行方法 [代理对象]
proxy.save();
}
}

  5、输出结果:

    class org.fkjava.b_dynamic.UserDaoImpl
    class com.sun.proxy.$Proxy0
    开启事务
    -----已保存数据-----
    提交事务

动态代理总结:

代理对象不需要实现接口,但是目标对象一定要实现接口;否则不能用动态代理!
         (class  $Proxy0 
implements IuserDao)

思考:

有一个目标对象,想要功能扩展,但目标对象没有实现接口,怎样功能扩展?

Class  UserDao{}

//
子类的方式

Class
subclass  extends  UserDao{}                                           

以子类的方式实现(cglib代理)

Java 代理模式 (二) 动态代理的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  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. 并发新特性—Executor框架与线程池

    http://blog.csdn.net/ns_code/article/details/17465497 Executor框架简介 在Java5之后,并发编程引入了一堆新的启动.调度和管理线程的AP ...

  2. Java8新特性_lambda表达式和函数式接口最详细的介绍

    Lambda表达式 在说Lambda表达式之前我们了解一下函数式编程思想,在数学中,函数就是有输入量.输出量的一套计算方案,也就是“拿什么东西做什么事情”. 相对而言,面向对象过分强调“必须通过对象的 ...

  3. 自制轮子 canvas tree

    这是树的效果 这个树拥有的功能有 1.小地图显示 2.小地图点击快速定位 3.点击加减显示根节点 4.基本的数显示 5.节点拖拽 6.点击头像跳转到相关页面 7.使用直角线和直线选择 8.画布自适应 ...

  4. CodeForces 620D Professor GukiZ and Two Arrays 双指针

    Professor GukiZ and Two Arrays 题解: 将a数组都sort一遍之后, b数组也sort一遍之后. 可以观察得到 对于每一个ai来说, 整个数组bi是一个V型的. 并且对于 ...

  5. Codeforces 938D Buy a Ticket

    Buy a Ticket 题意要求:求出每个城市看演出的最小费用, 注意的一点就是车票要来回的. 题解:dijkstra 生成优先队列的时候直接将在本地城市看演出的费用放入队列里, 然后直接跑就好了, ...

  6. 线段树模板 hdu 1166 敌兵布阵

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. 前端利器躬行记(4)——webpack进阶

    webpack是一个非常强大的工具,除了前文所介绍的基础概念之外,还有各种进阶应用,例如Source Map.模块热替换.集成等,本文会对这些内容做依次讲解. 一. runtime和manifest ...

  8. 换个角度使用VUE过滤器

    换个角度使用VUE过滤器 过滤器在Vue中的主要用于文本格式化,如小写转大小,日期格式化等操作.官方对这个功能介绍也很简单,不过确实很简单,就一个函数而已.但最近在做两款APP时,遇到一些特殊的需求. ...

  9. 深入理解SQL Server数据库Select查询原理(一)

    使用SQL Server十年有余,但是一直对其Select查询机制原理一致不明,直到最近有个通讯录表,很简单的一张表(但因简单,所以当时并没有考虑按部门排序问题),结果想查询某个单位所有部门(不重复) ...

  10. MariaDB数据库自学一

    在CentOS下安装Mariadb 数据库,命令: yum -y mariadb mariadb.server 等待几分钟后就可以自动完成安装了,然后启动对应的服务: systemctl  start ...