博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简述代理模式
阅读量:7104 次
发布时间:2019-06-28

本文共 1685 字,大约阅读时间需要 5 分钟。

hot3.png

1.代理模式定义

代理模式为另外一个对象提供一个替身或占位符以控制对这个对象的访问。使用代理模式创建代表对象,让代表对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或需要安全控制的对象。

2.代理的分类

1)虚代理

根据需要来创建开销很大的对象,该对象只有在需要的时候才会被真正创建。Hibernate中的懒加载就是用的虚代理。

2)远程代理

远程代理可以作为另一个JVM上对象的本地代表,调用代理的方法,会被代理利用网络转发到远程执行,并且结果会通过网络返回给代理,再由代理将结果转给客户。比如RMI。

3)保护代理

控制对原始对象的访问,如果有需要,可以给不同的用户提供不同的访问权限,以控制他们对原始对象的访问。比如Spring中的AOP。

3.动态代理的实现

在JAVA中,有两种方式来实现动态代理。一种方式是使用Java的API,另外一种方式是使用开源库CGLIB。使用Java API实现的动态代理的前提条件是必须实现接口,即面向接口编程。而CGLIB就没有限制,即可以动态继承java类又可以实现接口。

下面附使用JAVA API测试动态代理的例子:

1)Subject

public interface Person {	 public void sayHelloWorld();  }
2)RealSubject
public class Child implements Person {	@Override	public void sayHelloWorld() {		System.out.println("Hello World!");	}}
3)Proxy
public class HelloWorldHandler implements InvocationHandler {       //目标对象      private Object targetObject;              public HelloWorldHandler(Object targetObject){           this.targetObject = targetObject;       }              public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {           System.out.println("方法调用前。。。");           Object result = method.invoke(this.targetObject, args);           System.out.println("方法调用结束");                      return result;       }   }
4)Test
public class HelloWorldTest {       public static void main(String[] args) {           Person obj = new Child();           HelloWorldHandler handler = new HelloWorldHandler(obj);           Person proxy = (Person)Proxy.newProxyInstance(                   obj.getClass().getClassLoader(),                    obj.getClass().getInterfaces(),                    handler);           proxy.sayHelloWorld();       }   }

转载于:https://my.oschina.net/xishuixixia/blog/96547

你可能感兴趣的文章
各种jar包下载地址
查看>>
解决win10激活错误代码0xc004c003
查看>>
分布式事务
查看>>
nginx服务器开机启动设置
查看>>
个人编程作业1-GIT应用
查看>>
增加swap大小
查看>>
话说System.Object(读书笔记)
查看>>
基于群成员贡献分的群推荐系统
查看>>
Linux命令(21):w命令
查看>>
dbgrideh 添加footer和导出
查看>>
MPLS ×××路由传播及数据转发详解
查看>>
(5)Zabbix用户参数配置
查看>>
长沙市财政局数据存储备份及异地容灾设备采购技术内容
查看>>
LSI SVM 挑战IBM SVC
查看>>
敏捷开发一千零一问系列之十七:长期受制于强势客户怎么办?(上)
查看>>
php中的错误处理机制
查看>>
Symantec Antivirus 故障事例二
查看>>
HDU——2067 小兔的棋盘
查看>>
我的友情链接
查看>>
【Java基础】 Java跳转页面的两种方法以及它们的区别
查看>>