1.代理模式的核心思想
代理模式就是给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。就是一个人或者一个机构代替另一个人或者另一个机构去采取一些行动。代理模式中的代理者就好比中介机构,它提供了对被代理对象的一切事物。
代理模式与适配器模式和装饰器模式相似,它们之间的区别是:
适配器模式是将一个类A转换成另一个类B。
装饰器模式是为一个类A增加新的功能,从而变成类B。
代理模式是为一个类A转换操作类B。
它们三者的限制条件层层递进,递进关系如图12-16所示。
![]() |
代理模式中的"代理"要想实现代理任务,就必须与被代理的"对象"使用共同的接口。所以自然而然你会想到在Java中使用一个抽象类或者接口(推荐)来实现这个共同的接口。于是代理模式就有3个角色组成。
被代理对象的接口Sourcable:声明了代理对象和代理者的共同接口。
被代理对象Source:定义真实的对象。
代理者Proxy:内部包含对代理对象的引用,并且提供与代理对象角色相同的接口。
使用类图来表示下三者间的关系如图12-17所示。
![]() |
下面来看具体的实现。
(1)Sourcable类的源代码如程序12-28所示,其定义了一个接口函数operation()。
程序12-28 源接口Sourcable.java
- package structure.proxy;
- /**
- * @author liuzhongbing
- * 源接口
- */
- public interface Sourcable {
- public void operation();
- }
(2)Source.java是Sourcable.java的一个实现,其函数operation()负责往控制台输出一个字符串:原始类的方法。其源代码如程序12-29所示。
程序12-29 源类Source.java
- package structure.proxy;
- /**
- * @author liuzhongbing
- * 源类
- */
- public class Source implements Sourcable {
- public void operation() {
- System.out.println("原始类的方法");
- }
- }
(3)代理类Proxy.java采用了典型的对象适配器模式,它首先拥有一个Sourcable对象source,注意,不同的是该对象在构造函数中进行初始化,不能够从外部传入。然后它实现了Sourcable.java接口,以期保持与source同样的接口,并在重写的operation()函数中调用source的operation()函数,在调用前后可以调用自己的函数。其源代码如程序12-30所示。
程序12-30 代理类Proxy.java
- package structure.proxy;
- /**
- * @author liuzhongbing
- * 代理模式
- */
- public class Proxy implements Sourcable {
- private Source source;
- /**
- * 创建代理对象
- */
- public Proxy() {
- super();
- this.source = new Source();
- }
- /**
- * 调用代理对象的方法
- */
- public void operation() {
- before();
- source.operation();
- after();
- }
- public void before() {
- System.out.println("代理前");
- }
- public void after() {
- System.out.println("代理后");
- }
- }
这时,我们就可以直接通过Proxy来操作Source类。如程序12-31所示,首先需要创建一个代理对象proxy,然后直接调用该对象的operation()方法,即可实现对source的调用。
程序12-31 测试类Client.java
- package structure.proxy;
- /**
- * @author liuzhongbing
- */
- public class Client {
- public static void main(String[] args) {
- // 创建代理对象
- Sourcable proxy = new Proxy();
- // 调用代理对象的方法
- proxy.operation();
- }
- }
运行该程序的结果如下:
代理前
原始类的方法
代理后
从程序的输出可以看出,通过Proxy不仅实现了对Source的调用,还实现了自身的功能,这与装饰器模式很相似,不同的是它们的关注点不同:装饰器模式关注于扩展功能,而代理模式关注于如何调用。