#笔记#圣思园 JavaSE 第66讲——静态 、 动态 代理模式
来源:互联网 发布:淘宝护肤品店铺排行 编辑:程序博客网 时间:2024/06/04 18:22
1.代理模式
为其他对象提供一种代理,以控制这个对象的访问
某些情况下,一个客户不想或不能直接饮用另一个对象,而代理对象可以在客户端和目标对象之间起到中介作用。
2.代理模式涉及的角色:
抽象角色:声明真实对象和代理对象的共同接口
代理角色: 代理对象角色内部含有对真实对象的引用,从而可以操作真实对象
代理对象提供与真实对象相同的接口,以便在审核时刻都能代替真实对象
代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象
对于租房子的例子:代理角色是中介、真实角色是房主(中介和房主都可以完成“租房子”的事情)
3.代理模式实现
定义真实角色 和 代理角色的抽象类(或接口)
定义真实角色——继承抽象类(或实现接口)
定义代理角色**
测试类
输出:
4.上面代码中,真实角色必须事先存在,并将其作为代理对象的内部属性,这样在实际使用时,一个真实角色必须对应一个代理角色,如果大量使用会导致类的急剧膨胀。
此时需要使用java的动态代理类来解决。
5.动态代理类位于java.lang.reflect包下,主要涉及两个类:
(1)Interface InvocationHandler:该接口只有一个方法:
public object invoke(Object obj,Method method,Object[] args)
(2)Proxy:三个方法
protected Proxy(InvocationHandler h)
static class getProxyClass(ClassLoader loader,class[] interface)
static Object newProxyInstance(ClassLoader loader,class[] interface,Invocation Handler)
在使用动态代理类时,必须实现InvocationHandler接口
使用动态代理,就要有InvocationHandler!每一个代理实例,就有与之关联的InvocationHandler。
真正的调用在invoke方法里完成
6.动态代理步骤
(1)创建一个实现接口InvocationHandler的类,他必须事先invoke方法
(2)创建被代理的类以及接口
(3)通过Proxy的静态方法:newProxyInstance(ClassLoader loader, Class[] interfaces,InvocationHandler h)创建一个代理
(4)通过代理 调用方法
定义接口
定义真实角色
定义代理角色
客户端
7.例3:Foo.java,FooImpl.java,FooImpl2.java,CommonInvocationHandler.java,Demo.java
一个Foo接口有两个实现类:FooImpl和FooImpl2
定义抽象角色
定义第一个实现类,真实角色1
定义第二个实现类,真实角色2
定义代理角色
定义 客户端
- #笔记#圣思园 JavaSE 第66讲——静态 、 动态 代理模式
- #笔记#圣思园 JavaSE 第25讲——单例模式
- #笔记#圣思园 JavaSE 第51讲——策略模式和在集合中的应用
- #笔记#圣思园 JavaSE 第4讲——运算符
- #笔记#圣思园 JavaSE 第17讲——继承剖析
- #笔记#圣思园 JavaSE 第44讲——栈、队列
- #笔记#圣思园 JavaSE 第48讲——Map映射
- #笔记#圣思园 JavaSE 第72讲——JUnit框架
- JavaSE第六十五讲:静态代理模式深度剖析
- JavaSE第六十六讲:Java中的动态代理模式详解
- 代理模式——静态代理、动态代理、cglib代理
- 代理模式(静态代理+动态代理)——JAVA
- JavaSE之静态代理模式
- #笔记#圣思园 JavaSE 第5讲——运算符 续
- #笔记#圣思园 JavaSE 第6讲——流程控制语句
- #笔记#圣思园 JavaSE 第8讲——理解面向对象程序设计
- #笔记#圣思园 JavaSE 第9讲——面向对象之 封装 encapsulation
- #笔记#圣思园 JavaSE 第10讲——面向对象之 封装 encapsulation 续
- 第十三周项目三 立体族类的纯虚函数
- WKWebView 在64位设备上的白屏问题
- 第十四周程序阅读——例六
- OpenWrt系统安全改进<五> --- Web 访问权限分级
- 第14程序阅读 例6.2
- #笔记#圣思园 JavaSE 第66讲——静态 、 动态 代理模式
- c/C++内存分配
- 不安装Oracle客户端,使用PLSQL连接Oracle服务器
- android Graphics:区域(Region)
- many-tp-one
- Javascript:谈谈JS的全局变量跟局部变量(转zyz511919766)
- 数据结构系列之循环队列
- 6.10 文件转移
- 认识自己——做人要大气魄力,要经得住挑战