设计模式之代理模式之静态代理模式
代理模式(Proxy pattern)
核心作用:
通过代理,控制对对象的访问。
可以通过详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。(即AOP的微观实现)
AOP(面向切面编程。Aspect Oriented Programming)的核心实现的机制
举个例子来理解这种模式。例如明星,我的偶像周杰伦唱歌这种事。倘若有某个客户想让杰伦来唱歌。当然,杰伦作为明星类的对象,内部可以具有
面谈
合同起草
签字,收预付款
安排机票和车辆
唱歌
收尾款
当然,这样也会实现客户的需求。但是我们可以看到,杰伦会有多累呀。而且在这个过程中有太多事不需要杰伦操心。比如,面谈,合同起草等等,杰伦唯一需要关心的就是唱歌。我们当然不允许杰伦被其他的琐事分心,但其他的事情毕竟也很要紧,而且是每场演唱会都要坐做的流程。所以不能缺少。
因此,这也就出现了经纪人的概念。
倘若,此刻有用户想请杰伦来唱歌。他需要做的只是找杰伦的经纪人,来让经纪人面谈,合同起草,收尾款等等。而在客户要求代理唱歌的时候,在具体实现的过程中,由代理请求杰伦来唱歌。当然,这种结构很方便,因为如果这个经纪人也有其他的明星,只需要修改经纪人(代理)的内部的唱歌的方法就可以了。
代理模式(Proxy
Pattern)
核心角色:
抽象角色
定义代理角色和真是角色的公共对外方法。换言之代理角色和真实角色拥有一套相同的来自于抽象角色的方法
真实角色
实现抽象角色,定义真实角色所要实现的业务逻辑(比如唱歌,杰伦会唱歌,而代理人并不会唱),供代理角色使用
关注真正的业务逻辑(唱歌)
代理角色:
实现抽象角色,是真实角色的代理(经纪人),通过真实角色的业务逻辑(换言之,代理角色需要有个真实角色的成员变量,以访问真实角色的业务逻辑(比如唱歌))来实现抽象方法。并可以附加自己的操作。
将统一的流程控制放到代理角色中处理
应用场景:
安全代理:屏蔽对真实角色的访问
远程代理:通过代理类处理远程方法调用(RMI) 延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象。
比如你要开发一个大文档查看软件,大文档有大量图片,有可能一个图片有100M,在打开文件时不可能将所有的图片都显示出来,这样就可以使用代理模式,当需要查看图片时,用Proxy进行大图片的打开。
分类:
静态代理(静态定义代理类),即我们自己动手实现。
动态代理(动态生成代理类):不需要我们自定义,使用默认的
JDK自带的动态代理
Javaassist字节码操作库实现
CGLIB
ASM(底层使用指令,可维护性较差)
原文地址:http://blog.csdn.net/lk142500/article/details/44875953