java模式之一------代理模式
代理模式的概念:对其他对象提供一种代理以控制对这个对象的访问
代理模式的三种实现
(1)静态代理
静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类.
eg
public interface PammerDao{
void domain();
}
public Target implements PammerDao{
void domain(){
System.print.outln("我是实现类")
}
}
public ProxyTarget implements PammerDao{
private PammerDao pammerDao;
public ProxyTarget(PammerDao pammerDao){
this.pammerDao=pammerDao;
}
void domain(){
System.print.outln("我是实现类的代理类")
pammerDao.domain();
System.print.outln("我代理了Target类,扩展了他的domain方法")
}
public static void main (String args[]){
PammerDao pammerDao=new Target();
ProxyTarget proxy=new ProxyTarget(pammerDao);
proxy.domain();
}
}
静态代理的优缺点:
优点 :在不改变原有对象的前提下,使代码更加灵活,扩展。
缺点:如果接口增加方法,代理类势必会修改代码,其次 代理对象对应这一个委托对象,如果委托对象非常多,会造成很多代理对象,代码会非常臃肿。
动态代理:
特点:1 不需要实现接口
2 使用jdk的api,动态地在内存中构建代理对象。通过反射机制实现。
eg
public interface PammerDao{
void domain();
}
public Target implements PammerDao{
void domain(){
System.print.outln("我是实现类")
}
}
public ProxyTarget implements InvocationHandler{
Target target;//被代理的对象,即委托对象
public ProxyTarget(Target target){
this.target=target;
}
@Override
public Object invoke(
Object proxy, Method method, Object[] args)
throws Throwable
{
System.print.outln("我是实现类的代理类")
method.invoke(target,args);
System.print.outln("我代理了Target类,扩展了他的domain方法");
return null;
}
public static void main (String args[]){
PammerDao pammerDao=new Target();
ProxyTarget proxy=new ProxyTarget(pammerDao);
Proxy.newProxyInstance(pammerDao.getClass().getClassLoader,pammerDao.getClass().
getInterfaces(),proxy
);
proxy.domain();
}
}
一些动态代理的说明
(1)newProxyInstance()里面的三个参数
第一个参数,被加载对象的classLoader,不要求是实现类或者接口classloader,只要是AppClassLoader能加载到的类的classloader(即自己写的类)此处可以写成new Persion().calss().getClassLoader(),但是绝不能用Bootstrploader的类加载器和ExtClassLoader类加载器,否则拿到的classLoader为null。
第二个参数,被代理的方法集合,
如果被代理对象是一个实现类:对象.getClass().getinterfaces()
如果被代理对象是一个接口:new Class[]{interface.class}
第三个参数,代理对象。
代理对象不需要实现接口,但是目标对象一定要实现接口,否则不能用动态代理
(2)newProxyInstance都干了些什么
复制https://www.jianshu.com/p/5478f170d9ee 这位兄弟的图片给大家说下
(3)代理类
感兴趣的同学可以把1.1.1中的字节码通过io输出到本地文件看看,可以看到代理类继承了Proxy,因为java单继承性质,所以代理类不能再继承别的类,所以JDK的动态代理只支持接口的方式代理,并不能支持具体实现类的代理。
代理模式的应用场景:
1)在以前的早已实现接口上面进行扩展
2)想要隐藏某个类的时候,可以提供代理类
3)可以实现自己的业务逻辑在 InvocationHandler的实现类里面
4) 一些框架底层频繁的使用代理模式。
(4)代理模式的缺点
java模式之一------代理模式的更多相关文章
- Java设计模式之代理模式(Proxy)
前言: 最近在研究Retrofit开源框架的时候,其主要核心代码是通过注解标示参数,动态代理模式实现具体接口,反射机制进行参数解析,最终实现发送请求.其实之前在学习Xutils源码的时候,Xutils ...
- 说说Java中的代理模式
今天看到传智播客李勇老师的JDBC系列的第36节——通过代理模式来保持用户关闭连接的习惯.讲的我彻底蒙蔽了,由于第一次接触代理模式,感到理解很难,在博客园找到一篇文章,先记录如下: 引用自java设计 ...
- Java 设计模式_代理模式(2016-08-19)
概念: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...
- java设计模式之——代理模式
1,什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 2,策略模式有什么好处? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象 ...
- Java进阶篇设计模式之七 ----- 享元模式和代理模式
前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...
- java jdk动态代理模式举例浅析
代理模式概述 代理模式是为了提供额外或不同的操作,而插入的用来替代”实际”对象的对象,这些操作涉及到与”实际”对象的通信,因此代理通常充当中间人角色. java中常用的动态代理模式为jdk动态代理和c ...
- 谈谈Java中的代理模式
首先来看一下代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用, 其特征是代理类与 ...
- (转)轻松学,Java 中的代理模式及动态代理
背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...
- Java设计模式之七 ----- 享元模式和代理模式
前言 在上一篇中我们学习了结构型模式的组合模式和过滤器模式.本篇则来学习下结构型模式最后的两个模式, 享元模式和代理模式. 享元模式 简介 享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能 ...
- Java三种代理模式:静态代理、动态代理和cglib代理
一.代理模式介绍 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能. 简言之,代理模式就是 ...
随机推荐
- 【bash】今天你坑队友了吗
需求: 压缩日志并删除压缩过的文件 很日常的运维需求!!! 好,来看代码 echo 'start' quke.log rm -f quke.log echo 'delete' 不管是初级运维还是高级运 ...
- [JS] 四角度旋转特效
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...
- [Objective-C语言教程]日志处理(21)
为了打印日志,可使用Objective-C编程语言中的NSLog方法,首先在HelloWorld示例中使用了这个方法. 下面来看一下打印“Hello World”字样的简单代码 - #import & ...
- 3. STL编程三
1. 算法容器的使用: #include <iostream> #include <functional> #include <vector> #include & ...
- iOS -- UILabel的常见使用
UILabel是iOS开发经常用到的一个控件,主要用于显示文字.下面记录一些常用的UIlabel的使用. 先定义:UILabel *label = [[UILabel alloc]initWithFr ...
- POJ1095 Trees Made to Order(JAVA)
这题用到了卡特兰数,比较麻烦.关于卡特兰数的基本概念百度一下你就知道. 使用卡特兰数对数组元素进行分组之后,需要具体计算一下要求的是第几组的第几个数,然后向下递归. 首先来看利用卡特兰数分组: 从1开 ...
- mongodb主从备份 和 手动主从切换
环境: 主机A:172.16.160.91 主机B:172.16.160.92 配置主机A [root@master zhxf]# cat docker-compose.yml version: '3 ...
- 配置不同站点不同版本PHP
Apache 配置 1.常规手动部署apache方法(不会apache配置的请先移步看下Apache基本手工配置方法),解压fcgid,取其mod_fcgid.so至modules目录 2.打开htt ...
- Android中通过xml改变背景及文字颜色
原创文章,转载请注明出处,谢谢! 本篇主要介绍Android开发中,通过XML资源文件来设置控件在不同状态下的背景及文字颜色.关于xml改变背景及文字颜色的原理,大家可以去看一下郭霖大神的源码分析文章 ...
- Mac下使用PF进行端口转发和防火墙配置(类似Linux的iptables)
在Mac没有iptables这些,替代的软件为PF,命令为pfctl.在早些版本用ipfw(<=10.10),后面改为PF.还有一些可以使用OpenBsd,不过这个不太好用. 网上关于pfctl ...