代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。代理模式的主要优点有:
代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用;代理对象可以扩展目标对象的功能;代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性其主要缺点是:
代理模式会造成系统设计中类的数量增加在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;增加了系统的复杂度;当无法或不想直接引用某个对象或访问某个对象存在困难时,可以通过代理对象来间接访问。使用代理模式主要有两个目的:一是保护目标对象,二是增强目标对象。前面分析了代理模式的结构与特点,现在来分析以下的应用场景。
远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。例如,用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬盘,用户访问虚拟硬盘时实际访问的是网盘空间。虚拟代理,这种方式通常用于要创建的目标对象开销很大时。例如,下载一幅很大的图像需要很长时间,因某种计算比较复杂而短时间无法完成,这时可以先用小比例的虚拟代理替换真实的对象,消除用户对服务器慢的感觉。安全代理,这种方式通常用于控制不同种类客户对真实对象的访问权限。智能指引,主要用于调用目标对象时,代理附加一些额外的处理功能。例如,增加计算真实对象的引用次数的功能,这样当该对象没有被引用时,就可以自动释放它。延迟加载,指为了提高系统的性能,延迟对目标的加载。例如,Hibernate 中就存在属性的延迟加载和关联表的延时加载。代理模式的结构比较简单,主要是通过定义一个继承抽象主题的代理来包含真实主题,从而实现对真实主题的访问,下面来分析其基本结构和实现方法。
来源于网络
public interface TopicalSubject {
public void requestFunction();
}/**
* @descript 真实对象
* 作用是:定义真实的对象,也是被代理的对象
* the Function to be define the real object,the represented object
* @author 79197
*/
public class RealPerson implements TopicalSubject{
@Override
public void requestFunction() {
System.out.println("我是真实的对象,不知道代理如何介绍我的(I‘m a real object,I dont know how the agent introduces me)?");
}
}/**
* @descript 代理类
* 作用是:聚合真实对象,可以为真实对象添加修饰内容
* Aggregate real objects to add decoration content real objects
* @author 79197
*/
public class RepresentTopicalSubject implements TopicalSubject{
RealPerson realPerson=null;
@Override
public void requestFunction() {
if(realPerson==null) {
realPerson=new RealPerson();
}
open();
System.out.println("");
realPerson.requestFunction();
System.out.println("");
close();
}
public void open() {
System.out.println("进入代理,下面有代理介绍男方情况;(这小伙子给了钱了,一定要说一些好话!!!)");
System.out.println("After entering the agency,the following agent introduces the man;(The young man gave the money,So you must say something nice!!!!)");
}
public void close() {
System.out.println("代理结束!!!");
System.out.println("agency close!!!");
}
}public class RenterInvocationHandler implements InvocationHandler{
//被代理类的对象
private T target;
public RenterInvocationHandler(T target){
this.target = target;
}
/**
* proxy:代表动态代理对象
* method:代表正在执行的方法
* args:代表调用目标方法时传入的实参
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = method.invoke(target, args);
return result;
}
} public class TestRepresentMan {
public static void main(String[] args) {
//静态代码
/**RepresentTopicalSubject tempObj=new RepresentTopicalSubject();
tempObj.requestFunction();**/
//动态代理
TopicalSubject personObj=new RealPerson();
RenterInvocationHandler renterHandler=new RenterInvocationHandler(personObj);
//创建代理对象,代理对象的每个执行方法都会替换执行Invocation中的invoke方法
TopicalSubject renterProxy = (TopicalSubject)Proxy.newProxyInstance(TopicalSubject.class.getClassLoader(),new Class>[]{TopicalSubject.class}, renterHandler);
renterProxy.requestFunction();
}
} 版权声明:我们致力于保护作者版权,注重分享,被刊用文章【静态代理(动手写一个代理模式)】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!;
工作时间:8:00-18:00
客服电话
电子邮件
beimuxi@protonmail.com
扫码二维码
获取最新动态
