我们先说一下什么是代理?在生活中有哪些代理的使用场景?
1、代理其实就是帮助某些事物提供一些服务,比如房屋中介公司,他们就是代理,当你要买房的时候,你需要知道很多房产的信息,然后你很难获取到比较全的数据,那怎么办呢,就去找代理(房屋中介公司),代理会问地产开发商房子的价格、地段、格局等。。。信息,然后再给你。这就是代理干的事情。在开发系统中我们可能也会遇到这种情况,这个是时候代理模式就派上用场了。
2、代理模式的模板:
● Subject抽象主题角色 抽象主题类可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求。
● RealSubject具体主题角色 也叫做被委托角色、被代理角色。它才是冤大头,是业务逻辑的具体执行者。
● Proxy代理主题角色 也叫做委托类、代理类。它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角 色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作。
3、代理模式的分类:
3.1、静态代理:由程序员创建或由特定工具自动生成源代码,再对其编译,在程序运行前,代理类的.class文件就已经存在了。
3.2、动态代理:动态代理类的字节码在程序运行时由Java反射机制(jdk dynamic proxy)或修改字节码生成子类(cglib)动态生成,无需程序员手工编写它的源代码。
4、案例:
4.1、静态代理:我们模拟游戏代练,游戏代练也是代理的概念,玩家就是被代理者,代练就是真正干活的代理,类图如下:
代码结构:
IGamePlayer:
DNFGamePlayer:
LOLGamePlayer:
Proxy:
Test:
4.2、jdk 动态代理:jdk动态代理利用拦截器(拦截器必须实现InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类,
在调用具体方法前调用InvocationHanlder来处理,类图如下:
代码结构:
IGamePlayer:
GamePlayer:
GamePlayerHandler:
JdkDynamicProxy:此类只是提供一个静态方法用于运行期间创建代理对象。
Test:
4.3、cglib 动态代理:
代码结构图:
IGamePlayer:
GamePlayer:
GamePlayerInterceptor:
CglibDynamicProxy:
Test:
5、总结: