android 代理模式( 三 )


[java] view plain copy
house = new House(" Abbey", 5000);
house.();//这里只是通过创建出代理
Log.i(TAG, " for ahouse");
house.();
Log.i(TAG, "");
house.();
house.();
4.动态代理
上面介绍的都是自己先写好的代理类,这样代理关系都是固定的,当代理多个真实对象的时候就要写多个代理类,并且会产生冗余的代码,扩展性和可维护性都不高,而动态代理是基于反射实现了在程序运行的过程中才决定代理什么对象.像AOP的核心思想就是动态代理.(这里使用的是Java的动态代理)
既然是动态代理就不需要也不需要实现接口了,这里写一个实现的接口,并且提供一个根据Proxy构建出来的代理实例给.在通过反射调用真实对象具体的方法之前打印出该方法的名字.
[java] view plain copy
class{
finalTAG = .class.();
;
( ){
this. = ;
Proxy.(.().(),
.().(), this);
@
( proxy,, [] args){
ret;
Log.i(TAG, " name:" + .());
ret = .(, args);
ret;
[java] view plain copy
proxy = new ();
house = () proxy.(new House(" Abbey", 5000));
Log.i(TAG, " for ahouse");
house.();
Log.i(TAG, "");
house.();
house.();
Log.i(TAG, "so easy");
从结果可以看出在真正真实对象的方法之前都会打印出方法名,也可以在这里做一些其他的对象控制.

android 代理模式

文章插图
这个时候整个过程的时序图就变成下面的样子了,通过JDK的Proxy对象和反射的机制来支撑起来动态代理的核心功能.
android 代理模式

文章插图
三.总结
【android 代理模式】代理模式的使用场景还是挺多的,可以降低对象的复杂度,对项目进行解耦(特别是动态代理的AOP)等,学习设计模式其实最适合的方法就是拿来用,在适用于该模式的场景下灵活得去运用它才算是真正的掌握一种模式.