熟悉设计模式的人对于代理模式可能都不陌生。那什么事代理呢,例如我们要买一件国外的商品,但是自己买不到只能去找代购,这个代购就是我们的代理。我们来了解下java中的代理

静态代理


我们来举一个开车的例子,

首先定义一辆车

再新建一个具体实现类

这个时候启动汽车

输出

汽车发动

这个时候我们想在汽车发动前系上安全带,汽车发动后开始加速

我们可以这么写

这个时候我们再启动汽车

输出:

系安全带
汽车发动
加速前进

这里的CarProxy就是CarImpl的代理,CarImpl委托CarProxy实现启动前后的逻辑

动态代理


静态代理虽然好用,但是还是不够灵活。如果这个时候我在Car 再加一个刹车的方法,那么CarProxy也要实现相应的方法,这样的耦合性太强了。所以这个时候就需要介绍下另一种代理模式  动态代理

什么事动态代理呢?动态代理是在实现阶段不用关心代理谁,而在运行阶段才能确定代理那个对象?简单来说,动态代理不用自己写代理类

1.JDK代理

还是开车,我们再写一个代理类

刚开始看到可能会觉得很奇怪,这个类怎么开车呢,简而言之,这个类怎么才能代理Car的start方法呢。

这里主要用到了反射,JdkDynamicCarProxy调用方法时会调用invoke方法,通过反射代理原对象

同时,JdkDynamicCarProxy这个并不是代理类,他只是一个代理策略,我们不能只通过他实现代理

好,具体的我们开次车就知道了

我们首先要生成一个代理策略

再生成一个代理类,这里我们通过Proxy生成,这里有三个参数

参数1:ClassLoader
参数2:该实现类的所有接口
参数3:动态代理对象

合起来,现在的开车流程变成了

每次都要这一堆代码太浪费时间了,我们把它简化下,在JdkDynamicCarProxy中新加一个方法获取代理类

现在开次车的流程变成了

2.cglib代理


我们先新建一个代理策略类

这里需要实现 CGLib 给我们提供的 MethodInterceptor 实现类,并填充 intercept() 方法。方法中最后一个 MethodProxy 类型的参数 proxy,值得注意!CGLib 给我们提供的是方法级别的代理,也可以理解为对方法的拦截

跟jdk代理一样,我们需要新建一个代理类,这里我们通过Enhancer

Enhancer允许为非接口类型创建一个Java代理。Enhancer动态创建了给定类型的子类但是拦截了所有的方法。

现在开次车的流程变成了

感觉每次用都要new特别浪费

用单例模式改造下

现在开次车的流程变成了

好了,关于代理就介绍到这。

Java 代理模式的更多相关文章

  1. Java代理模式

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

  2. Java代理模式示例程序

    Java代理模式示例程序 当然不是我想出来的,是我看的一个网上教程里的. 模拟的是一个对电脑公司的代理 真实类的接口: public interface SaleComputer { public S ...

  3. java 代理模式 总结

    1.前言 最近舍友去面试遇到了关于java代理模式的问题. 我虽然知道怎么使用,但是没有做过正经的总结,因此有了这篇随笔,好好总结一下三大代理模式底层原理. 事实上,在开发项目的时候,基本用不上代理, ...

  4. 浅谈java代理模式

    讲解java代理模式 目录 讲解java代理模式 何谓代理模式 静态代理 动态代理 JDK动态代理 CGLIB动态代理 何谓代理模式 代理模式,即Proxy Pattern,23种java常用设计模式 ...

  5. Java代理模式/静态代理/动态代理

    代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委 ...

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

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

  7. java 代理模式一: 静态代理

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

  8. 18 java 代理模式 (转)

    静态代理 1.新建一个接口,这个接口所提供的方法是关于数据库操作的 public interface EmployeeDao { public void updateSalary(); } 2.建一个 ...

  9. JAVA 代理模式(Proxy)

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

  10. Java代理模式——静态代理模式

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

随机推荐

  1. OO第9-11作业总结

    一. 规格化设计   规格化抽象,即将执行的细节抽象为用户所需求的行为(模块做什么). 主要作用在于提高工程设计中的可维护性,可读性,明确功能,使整个编程任务变得清晰有序以减少程序BUG. 说其发展历 ...

  2. xbee PRO S2C的多固件烧写

    XBee and XBee-PRO ZB 嵌入式射频模块是与ZigBee/IEEE 802.15.4兼容的解决方案,可以满足低成本低功耗无线传感网络的特殊需求.该模块易于使用,极低的功耗,以及提供设备 ...

  3. Django项目及应用的创建

    一.url解释 1url是全球资源定位符,网上的每个文件都有唯一的url地址,组成:协议.服务器名称(或IP地址).路径和文件名. 2有时候,URL以斜杠“/”结尾,而没有给出文件名,在这种情况下,U ...

  4. Monkey压力测试操作步骤说明

    一.需配置java环境和android环境 JDK安装包:链接:https://pan.baidu.com/s/1SlnBOS0f3m2wVpEZBPfmag                      ...

  5. Codeforces Round #548 (Div. 2) F splay(新坑) + 思维

    https://codeforces.com/contest/1139/problem/F 题意 有m个人,n道菜,每道菜有\(p_i\),\(s_i\),\(b_i\),每个人有\(inc_j\), ...

  6. 检测MySQL主从备份是否运行

    通过查看 slave  状态,确保 Slave_IO_Running: Yes Slave_SQL_Running: Yes #!/bin/bash#Author:Darius-Dmysql -uro ...

  7. UNIX笔记 第二天

    一.进程的退出: exit(3) _exit(2) atexit(3)  onexit(3) 二.进程资源的回收:wait(2) waitpid(2) 三.加载新的可执行程序: exec函数族 exe ...

  8. [swarthmore cs75] inlab1 — Tiny Compiler

    课程回顾 Swarthmore学院16年开的编译系统课,总共10次大作业.本随笔记录了inlab1的实践过程. tiny compiler 这个迷你的编译器可以将一个源文件,编译成可执行的二进制代码. ...

  9. 通过iptables添加QoS标记

    1.什么是QoS QoS是一种控制机制,它提供了针对不同用户或者不同数据流采用相应不同的优先级,或者是根据应用程序的要求,保证数据流的性能达到一定的水准.QoS的保证对于容量有限的网络来说是十分重要的 ...

  10. OC字典的使用

    在OC中,字符串.数组.字典是最常见的对象类型,但是在这三个当中,字典的用法相对较少,因为字典的属性和方法比较少,但是一个字典的用法比较复杂,因为在一个字典当中,既可以包含字符串,也可以包含数组,数组 ...