代理模式与静态代理

标签: 架构设计, 设计模式

保留所有版权,请引用而不是转载本文(原文地址 https://yeecode.top/blog/04/ )。

1 代理模式

1.1 定义

代理模式:对某一个目标对象提供它的代理对象,并且由代理对象控制对原对象的引用。

例如,我们想访问某个对象A时,不能直接访问,需要由对象A的代理对象A Proxy进行代理。通俗来说,A Proxy我们可以认为是A的助理、中介、对外联络人。

图片

1.2 作用

隔离作用:可以防止对目标对象的直接访问,实现目标对象与外部的隔离,从而提供安全保障等。例如:在代理中增加权限身份验证。

扩展功能:代理对象可以在目标对象的基础上增加功能。例如:Java切面操作通过建立代理实现。

直接替换:代理对象可以直接替换目标对象的功能,带来全新的实现方式。例如:RPC通过建立代理,直接实现了不存在的接口实现(消费者中只有接口,没有实现类,RPC直接把对实现类的访问转走了)。

2 静态代理

静态代理就是按照代理模式书写的代码,其特点是代理类和目标类在代码中是确定的,因此是静态的。

我们举例子进行介绍。

首先,写出目标类和代理类共同需要实现的接口,我们假设只有一个打招呼的功能。

public interface UserInterface {
    void sayHello(String name);
}

目标类实现如下:

public class User implements UserInterface {
    @Override
    public void sayHello(String name) {
        System.out.println("hello " + name);
    }
}

代理类实现如下:

public class UserProxy implements UserInterface {
    private UserInterface target;

    public UserProxy (UserInterface target) {
        this.target = target;
    }

    @Override
    public void sayHello(String name) {
        System.out.println("pre words");
        target.sayHello(name);
        System.out.println("post words");
    }
}

测试方法如下:

public class Main {
    public static void main(String[] args) {
        // 生成被代理对象
        User user = new User();

        // 生成代理,顺便告诉代理他要代理谁
        UserProxy userProxy = new UserProxy(user);

        // 触发代理方法
        userProxy.sayHello("Tom");
    }
}

我们看到输出如下:

pre words
hello Tom
post words

通过静态代理,我们在目标方法的前后增加了一些操作。

但是,静态代理显然不够灵活。

这时,就需要动态代理。他能在代码运行时动态地改变某个对象的代理,并且能为代理对象动态地增加方法、增加行为。

在后面的文章中,我们会介绍动态代理的实现。

本文首发于个人知乎:易哥(https://www.zhihu.com/people/yeecode),欢迎关注。

作者书籍推荐