设计模式之代理模式
来源:互联网 发布:北大青鸟的java课程 编辑:程序博客网 时间:2024/06/15 00:10
设计模式之代理模式
1、什么是代理模式:
代理模式(Proxy)为另一个对象提供一个替身或占位符以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象。
就是一个接口由两个类来实现,一个是真实角色,一个是代理角色。
代理可以提供延迟实例化(lazy instantiation),控制访问, 等等。
2、代理模式中的角色:
抽象角色:声明的共同接口或者是抽象类。
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象能代替真实对象。同时,代理对象可以附加其他的操作,相当于对真实对象进行封装。
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。
3、什么时候使用代理模式:
当我们需要使用的对象很复杂或者需要很长时间去构造,这时就可以使用代理模式(Proxy)。
一个对象,比如一幅很大的图像,需要载入的时间很长。
一个需要很长时间才可以完成的计算结果,并且需要在它计算过程中显示中间结果
一个存在于远程计算机上的对象,需要通过网络载入这个远程对象则需要很长时间,特别是在网络传输高峰期。
一个对象只有有限的访问权限,代理模式(Proxy)可以验证用户的权限
4、代理模式的分类:
1、静态代理:
主要实现思路:
1) 两个类都实现一个公共的接口。真实角色实现接口,重写方法;
2) 代理类与真实角色的区别是:在代理类中创建一个私有的真实角色的对象,并写有参构造。也就是说:
首先代理类持有真实角色的一个引用。
然后在重写接口的方法的时候,用真实角色的引用调用真实角色的实现方法。
2、动态代理:
主要作用:借助于JVM的支持,可以在运行时动态生成代理类(“代理角色”),就可以解决代理模式中代码膨胀的问题,使用了动态代理后,“代理角色”将不用手动生成,而由JVM在运行时,通过指定类加载器、接口数组、调用处理程序这3个参数来动态生成。
从JDK1.3开始,java中引入了动态代理机制。
相关的接口或类有如下两个:InvocationHandler和Proxy,都位于java.lang.reflect包下。
InvocationHandler接口只定义了一个抽象方法:
Object invoke(Object proxy, Method method, Object[] args)
Proxy类中主要的2个静态方法:
Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces) 返回一个动态创建的代理类(Class)
Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)返回一个改代理类的一个实例(Object)
参数:
Loader:代理类的classloader;
Interface:代理类实现的接口列表:
H:调用处理器,就是从下面说的中介类;
注意:上述方法进行创建对象后,当执行该代理对象调用方法的时候,jvm会动态指派“调用处理器”,向外层invoke传递参数,并调用method.invoke()执行;
中介类:(调用处理器)
在真实角色和代理角色之间有一个中介类,需要
① 实现invocationhandler接口,这个中介类叫做“调用处理器”,拦截对代理类方法的调用。该接口只有一个invoke()方法,里面有三个参数,
分别是:
proxy参数是代理类对象,
method是具体调用的代理类的那个方法,
args是这个方法的参数。
② 私有化真实角色----有参构造
真实角色、中介类关系:
真实角色
真实类
中介类
代理类
中介类、代理角色关系:
中介类
真实类
代理角色
代理类
总结:动态代理就是两个静态代理关系组成。
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之-代理模式
- 设计模式之 代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- 设计模式之-----代理模式
- 设计模式之代理模式
- 设计模式之-代理模式
- 设计模式之代理模式
- 设计模式之代理模式
- Windows 10 如何将网络环境设置从Public设置为Private
- 计数排序
- 题目:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下 的用C表示
- linux驱动程序多模块编译链接时的问题
- Python数据分析学习路径图
- 设计模式之代理模式
- vb.net 教程 5-10 Graphics类 2
- CentOS6.8下Redis安装
- PHP常用字符串处理函数
- vspm虚拟串口调试
- javascript基础入门1
- windows下安装使用Maven
- python3学习笔记:零碎知识点
- register--皇帝身边的小太监(这样的比喻确实挺生动)