写在前边: 知识分为广度和深度,为了知识不丢失,所以学习多点内功更有利于后续发展,今天分享动态代理模式。
代理模式简介
代理模式,字面上的意思就是代理某个人去做某件事。比如代办证件,可以找代办公司帮忙代理办证。
根据代理的创建时期,代理模式分为静态代理
和动态代理。
静态代理
静态代理就是由程序员创建代理类或特定工具自动生成源代码再对其编译,在程序运行前代理类的 .class 文件就已经存在的代理。
代理模式的主要角色如下
抽象主题(IUser)类
:通过接口或抽象类声明真实主题和代理对象实现的业务方法。真实主题(ChineseUser)类
:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。代理(Translator)类
:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。
例: 翻译官翻译中国人的中文
图1 代理模式的结构图
在代码中,一般代理会被理解为代码增强,实际上就是在原代码逻辑前后增加一些代码逻辑,而使调用者无感知。
实现如下:
/**
* 抽象角色
*
* @Author JUNSHI
* @Create 2022-04-06 17:00
*/
public interface IUser {
/**
* 说话
* @return
*/
void say();
}
/**
* 中国人
*
* @Author JUNSHI
* @Create 2022-04-06 17:01
*/
public class ChineseUser implements IUser{
@Override
public void say() {
System.out.println("中国人说了:广东");
}
}
/**
* 翻译官:代理对象
*
* @Author JUNSHI
* @Create 2022-04-06 17:03
*/
public class Translator implements IUser {
private ChineseUser chineseUser = new ChineseUser();
@Override
public void say() {
// 原角色说话
chineseUser.say();
// 翻译官做翻译(代理人实现)
translate();
}
private void translate(){
System.out.println("翻译官翻译了: GuangDong");
}
}
/**
* 代理测试
*
* @author JUN
*/
public class ProxyTest {
public static void main(String[] args) {
Translator translator = new Translator();
translator.say();
}
}
运行结果:
文献参考:【代理模式(代理设计模式)详解】