Java代理模式实现与原理详解(一)

关于Java中的代理,我们首先需要了解的是一种常用的设计模式——代理模式,而对于代理,可根据代理类创建的时间点,分为静态代理和动态代理。今天我们先来了解一下Java中的静态代理。

1 代理模式

代理模式是一种常用的设计模式,百度百科中对其定义为:为其他对象提供一个代理以控制对某个对象的访问。在某些情况下,一个对象不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。即代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。代理类与委托类通常会存在关联关系,通常需要实现同一个接口。一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。代理模式的思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象。这些额外的操作通常需要与实际对象进行通信。

图1-1  代理模式结构图(图片来自《大话设计模式》)

2 静态代理

2.1、静态代理

静态代理:由程序员创建或者由第三方工具生成,再进行编译;在程序运行之前,代理类的.class文件已经存在了。静态代理通常只代理一个类,并且要事先知道代理的是什么。

2.2、静态代理的简单实现

上面已经用文字说明了代理模式及静态代理的一些原理,为了更好的理解其原理,我们来看代码。我这儿给大家举一个简单的例子,假如一个班上的同学要向老师提交作业,但是老师并不直接收每个人的作业,都是通过把作业交给学习委员,再由学习委员将作业转交给老师。在这里面就是学习委员代理班上学生上交作业,学习委员就是学生的代理。

首先,我们先定义一个Person接口,接口里面定义一个提交作业的方法。

然后写一个Student类实现Person接口。Student便可以具体实施提交作业的动作。

接下来我们先来看不使用代理的代码实现学生提交作业的功能。

运行结果:

可以看到,当一个学生要完成提交作业时,我们要先创建一个学生对象,再由该学生对象自己完成提交作业。

再来看使用代理过后的操作。要使用代理。我们先创建一个StudentProxy代理类,同样实现Person接口,这样代理类也能完成提交作业的功能。

下面我们来测试一下,看如何使用代理模式:

运行结果:

可以看到,我们先声明了一个学生对象zhangsan(被代理对象),接着生成代理对象并将zhangsan传给了代理对象,最后由代理对象代其完成了作业提交,而不是上面的由学生对象zhangsan直接提交。这就是代理模式。

3 代理模式应用场景

上面我们讲了代理模式的原理并且简单实现了一个静态代理。那有人就会问了,我既然可以直接通过学生对象直接完成提交作业,那为什么还要用代理来实现呢?用代理实现代码量反而增加了。其实代理模式就是在访问实际对象时引入一定程度的间接性,这种间接性可以附加多种用途。这里的间接性就是指不直接调用实际对象的方法,那么我们在代理过程中就可以加上一些其他用途。这样降低了系统的耦合度。例如上面的例子,学生张三在提交作业后会收到一个作业评价。通过代理模式就可以在不修改源码的基础上轻松办到:

运行结果:

可以看到,我们只在代理类中帮张三提交了作业过后,执行其他操作,便实现了我们想要的功能,并没有去修改我们原有的Student类中的代码。这种操作也是使用代理模式的一个很大的优点。

4 总结

其实代理模式最主要的就是有公共接口(Person),一个代理类(StudentProxy),代理类持有具体类的实例,代为执行具体类的实例方法。

代理模式其优点在于:

  1. 代理模式实现使用者与真实处理者的分离,降低系统的耦合度;
  2. 调用接口时,便于扩展一些业务无关的其他操作,不影响原系统。

缺点在于:增加类代理角色,性能上比直接使用低。

本文我们分析了代理模式以及静态代理的原理与实现,在下一次我们将详细分析动态代理的原理与实现,继续揭开代理模式的神秘面纱。

参考文献

吴强——《大话设计模式》——企业管理出版社

猜你喜欢

转载自blog.csdn.net/zcczero/article/details/84677491
今日推荐