首页 / JAVA / java模式之一------代理模式
java模式之一------代理模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java模式之一------代理模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3268字,纯文字阅读大概需要5分钟。
内容图文
![java模式之一------代理模式](/upload/InfoBanner/zyjiaocheng/845/ff8537c272424172b85bcf42f6fa521b.jpg)
代理模式的概念:对其他对象提供一种代理以控制对这个对象的访问
代理模式的三种实现
(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模式之一------代理模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。