天天看点

GOF23代理模式之静态代理模式理解之经典

      
设计模式之代理模式之静态代理模式      
     代理模式(Proxy
pattern)      
         核心作用:      
              通过代理,控制对对象的访问。      
                   可以通过详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。(即AOP的微观实现)      
              AOP(面向切面编程。Aspect
Oriented Programming)的核心实现的机制      
         举个例子来理解这种模式。例如明星,我的偶像周杰伦唱歌这种事。倘若有某个客户想让杰伦来唱歌。当然,杰伦作为明星类的对象,内部可以具有      
  1. 面谈      
  2. 合同起草      
  3. 签字,收预付款      
  4. 安排机票和车辆      
  5. 唱歌      
  6. 收尾款      
当然,这样也会实现客户的需求。但是我们可以看到,杰伦会有多累呀。而且在这个过程中有太多事不需要杰伦操心。比如,面谈,合同起草等等,杰伦唯一需要关心的就是唱歌。我们当然不允许杰伦被其他的琐事分心,但其他的事情毕竟也很要紧,而且是每场演唱会都要坐做的流程。所以不能缺少。      
因此,这也就出现了经纪人的概念。      
倘若,此刻有用户想请杰伦来唱歌。他需要做的只是找杰伦的经纪人,来让经纪人面谈,合同起草,收尾款等等。而在客户要求代理唱歌的时候,在具体实现的过程中,由代理请求杰伦来唱歌。当然,这种结构很方便,因为如果这个经纪人也有其他的明星,只需要修改经纪人(代理)的内部的唱歌的方法就可以了。      
代理模式(Proxy
Pattern)      
     核心角色:      
  • 抽象角色
    
    定义代理角色和真是角色的公共对外方法。换言之代理角色和真实角色拥有一套相同的来自于抽象角色的方法      
  • 真实角色
    
    实现抽象角色,定义真实角色所要实现的业务逻辑(比如唱歌,杰伦会唱歌,而代理人并不会唱),供代理角色使用
    
    关注真正的业务逻辑(唱歌)      
  • 代理角色:
    
    实现抽象角色,是真实角色的代理(经纪人),通过真实角色的业务逻辑(换言之,代理角色需要有个真实角色的成员变量,以访问真实角色的业务逻辑(比如唱歌))来实现抽象方法。并可以附加自己的操作。
    
    
    
    将统一的流程控制放到代理角色中处理      
应用场景:      
     安全代理:屏蔽对真实角色的访问      
     远程代理:通过代理类处理远程方法调用(RMI)

     延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象。      
         比如你要开发一个大文档查看软件,大文档有大量图片,有可能一个图片有100M,在打开文件时不可能将所有的图片都显示出来,这样就可以使用代理模式,当需要查看图片时,用Proxy进行大图片的打开。      
分类:      
     静态代理(静态定义代理类),即我们自己动手实现。      
     动态代理(动态生成代理类):不需要我们自定义,使用默认的      
  • JDK自带的动态代理      
  • Javaassist字节码操作库实现      
  • CGLIB      
  • ASM(底层使用指令,可维护性较差)      

继续阅读