Java设计模式:代理模式的介绍及代码演示

30 阅读3分钟

代理模式介绍

代理模式是指,客户端不直接访问目标对象,而是通过一个代理类去完成对目标对象的访问,在代理类中,可以对目标对象做一些访问控制。打个比方说,现在客户端要访问一个目标对象,但是客户端需要向目标对象传递符合条件的数据,否则程序会报错,这个时候就可以在两者之间创建一个代理对象,客户端先访问代理对象,在代理对象中,对客户端传递的数据进行校验,如果符合条件继续访问目标对象,否则向客户端返回错误提示,在这个例子中,代理对象实现了客户端对目标对象的访问控制。

image.png

上面的图中有三个类,分别为客户端类、代理类和目标对象类,代理类实现了对目标对象类的访问控制,客户端必须传递符合条件的参数,才能成功访问到目标对象,否则会被代理对象拦截。

代理模式示例代码

通过代理模式实现客户端访问目标对象

创建目标对象

/**
 * 目标对象-测试接口
 */
public class TestApi {
    /**
     * 打印参数
     */
    public void printParam(String body) {
        System.out.println("请求成功:"+body);
    }
}

目标对象包含一个打印参数的方法printParam,如果客户端通过代理类成功访问到目标对象,则会调用这个方法。

创建代理对象

/**
 * 代理对象
 */
public class TestApiProxy {
    private TestApi testApi;

    public TestApiProxy() {
        testApi = new TestApi();
    }

    public void printParam(String body) {
        if(body.indexOf("Hello")<0) {
            System.out.println("传递的参数不符合条件,必须包含'Hello'");
            return;
        }
        testApi.printParam(body);
        System.out.println("访问目标对象成功");
    }
}

在代理对象中,包含了目标对象,代理对象也有一个printParam()方法,当请求的参数符合代理对象的校验条件时,此方法会调用目标对象的printParam()方法,否则提示错误信息。

创建客户端测试代码

public class test_01 {
    public static void main(String[] args) throws InterruptedException {
        new TestApiProxy().printParam("Hello");
    }
}

运行结果:

image.png

当客户端在访问目标对象时,如果传递的参数符合要求,那么代理对象会调用目标对象,否则,代理对象不会去访问目标对象,代理对象的主要作用就是实现对目标对象的访问控制。

总结

如果一个对象的访问需要一定的权限或条件就可以选择使用代理模式,代理是客户端和目标对象的中间层,可以对目标对象进行一些控制和处理,在真实对象被访问之前或之后灵活的添加自定义的功能。代理模式从一定程度上提高了程序的安全性与灵活性。在本文的示例中,介绍了静态代理模式,还有一种代理模式被称为动态代理。动态代理和静态代理的区别主要体现在代理触发的时机不同,静态代理在程序运行之前(编译期间)就确定了代理的实现,而动态代理要在程序运行时动态的创建一个代理类的对象。