代理模式简介
代理模式是常用的一种设计模式,我们需要知道这几点:
(1)代理类和被代理类之间有关联关系,一个代理对象与一个被代理对象关联;
(2)代理对象本身并不真正实现服务,而是去调用被代理对象的服务;
(3)使用者通过调用代理对象间接地使用被代理对象的服务;
(4)代理类主要负责在调用被代理对象服务之前或之后进行一些预处理或事后消息处理,如打印日志、安全检查等;
代理模式使用场景
代理模式的使用场景:
(1)想要隐藏某个类时;
(2)想要扩展类的功能时;
代理模式分为静态代理和动态代理,下面我们看下他们的实现流程及源码分析。
静态代理实现流程
1.创建被代理类接口
import java.awt.*;
/**
* @author codeZhao
* @date 2021/1/12 11:35
* @Description 字体获取接口
*/
public interface FontProvider {
Font getFont(String name);
}
复制代码
2.实现被代理类对象
import java.awt.*;
/**
* @author codeZhao
* @date 2021/1/12 11:37
* @Description 被代理对象
*/
public class FontProviderFromDisk implements FontProvider {
@Override
public Font getFont(String name) {
System.out.println("get " + name + " from disk.");
return null;
}
}
复制代码
3.创建代理类
import java.awt.*;
/**
* @author codeZhao
* @date 2021/1/12 11:46
* @Description 代理类
*/
public class FontProviderProxy implements FontProvider {
//被代理对象
private FontProvider fontProvider;
public FontProviderProxy(FontProvider fontProvider) {
this.fontProvider = fontProvider;
}
//代理获取字体方法,调用被代理对象的获取字体方法
@Override
public Font getFont(String name) {
Font font = fontProvider.getFont(name);
return font;
}
}
复制代码
4.静态代理测试
import java.awt.*;
/**
* @author codeZhao
* @date 2021/1/12 13:59
* @Description 代理测试
*/
public class FontProviderProxyTest {
public static void main(String[] args) {
//生成被代理对象
FontProvider fontProvider = new FontProviderFromDisk();
//生成代理对象
FontProviderProxy fontProviderProxy = new FontProviderProxy(fontProvider);
//代理对象代理实现getFont()方法
Font font = fontProviderProxy.getFont("xxx");
}
}
复制代码
5.运行测试类
通过上面的实现流程可以看到,代理类中绑定了一个被代理类,代理对象执行方法时调用了所绑定的被代理对象的方法。
可以体会到采用代理模式的优点在于:我们可以在一个方法之前或之后加上一些额外的操作,扩展方法的功能,比如在每个方法执行前打印日志、安全检查等,Spring 的 AOP(面向切面编程)也就是应用了代理模式,可以在切点前后执行额外操作,切点就是一个个的方法。
评论