首页 > 代码库 > 设计模式之代理模式

设计模式之代理模式

1、代理模式(Proxy pattern)的介绍 :


    a、核心作用:

    -  通过代理,控制对对象的访问!

    *  可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,在调用这个方法后做后置处理。(即:AOP (面向切面编程)的微观实现)


    b、核心角色:

    -  抽象角色: 定义代理角色和真实角色的公共对外方法

    -  真实角色: 实现抽象角色,定义真实角色所要实现的业务逻辑,共代理角色调用。(即关注真正的业务逻辑)

    -  代理角色: 实现抽象角色,是真正角色的代理,通过真正角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。(即将统一的流程控制放到代理角色中处理)


2、代理模式的分类:


    -  静态代理(静态定义代理类)


    -  动态代理(动态生成代理类,常用)

        *  JDK 自带的动态代理:

          -  java.lang.reflect.Proxy  :  作用是动态生成代理类和对象

          -  java.lang.refect.InvocationHandler(处理器接口)

            *  可以通过 invoke 方法实现对真正角色的代理访问。

            *  每次通过 Proxy 生成的代理类对象是都要指定对应的处理器对象。


        *  javaassist 字节码操作库实现


        *  CGLIB


3、静态代理的简单代码示例:


    a、创建 Star 接口和其实现类 ProxyStar、RealStar,以及测试类 Client07。


技术分享


技术分享


技术分享

技术分享


    注:我们可以看到,Star 接口可以看作是抽象角色,而 ProxyStar 类是代理角色,RealStar 类是真实角色。(代理角色与真实角色之间的关系是组合关系)


    b、以上静态代理的代码示例的类图。


技术分享

    注:可以看到,客户端调用者 Client07 只是和 Star 接口打交道。


4、动态代理的简单示例代码:


    a、和静态代理一样,需要抽象角色和真实角色。

    

技术分享

技术分享


    b、创建一个实现了 InvocationHandler 接口(处理器接口)的实现类 StarHandler,并且重写invoke 方法。在 Client08 调用测试类中,使用 Proxy.newProxyInstance() 方法创建一个 对 realStar 对象的代理对象, 并且详细控制该对象的访问方法。(看看输出结果,可以在真实角色的业务方法调用前或者调用后做一系列的操作流程。)


技术分享



技术分享

技术分享


5、应用场景:


    -  安全代理:屏蔽对真实角色的直接访问。

    -  远程代理:通过代理类处理远程方法调用(RMI)

    -  延迟代理:先加载轻量级的代理对象,真正需要再加载真正对象。

本文出自 “12392717” 博客,请务必保留此出处http://12402717.blog.51cto.com/12392717/1928406

设计模式之代理模式