Java设计模式之代理模式

什么是代理模式?

  • 在某些情况下,一个客户类不能或者不想直接访问某个对象,而通过代理类对象就可以在客户类和委托对象之间起到中介的作用。
  • 代理模式分为静态代理和动态代理
    • 静态代理需要自己手动创建代理类,代理类和委托对象的关系在运行前就已经确定了。
    • 动态代理在实现的时候不需要关系委托对象,运行的时候才指定具体委托对象。
  • 动态代理的实现方式。
    • JDK动态代理(Java自带的动态代理),需要实现 InvocationHandler接口。
    • cglib 是第三方动态代理框架 。
  • 静态代理具体实现:
    • 静态代理模式
    • /**

      * 代理模式-委托接口

      */

      public interface OrderService {

      void order();

      }

      --------------------------------------------------------------------------------------

      /**

      * 代理模式-委托类

      */

      public class OrderServiceImpl implements OrderService {

      @Override

      public void order() {

      System.out.println("正在生成订单");

      }

      }

      /**

      * 代理模式-代理类

      */

      public class OrderProxy implements OrderService {

      private OrderService orderService;

       

      public OrderProxy(OrderService orderService){

      this.orderService=orderService;

      }

       

      @Override

      public void order() {

      System.out.println("生成订单之前");

      orderService.order();

      System.out.println("生成订单之后");

      }

      }

      public class ClientTest {

      public static void main(String[] args) {

      //静态代理

      OrderProxy orderProxy=new OrderProxy(new OrderServiceImpl());

      orderProxy.order();

      }

      }

  • 动态代理模式
    • JDK实现动态代理
  • /**

    * 动态代理-JDK动态代理

    */

    public class JDKHandlerProxy implements InvocationHandler {

    public Object target;

     

    public JDKHandlerProxy(Object target){

    this.target=target;

    }

    @Override

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

    System.out.println(">>>日志收集开始>>>>");

    Object invoke = method.invoke(target, args);

    System.out.println(">>>日志收集结束>>>>");

    return invoke;

    }

     

    public <T> T getProxy(){

    return (T)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);

    }

    }

    public class ClientTest {

    public static void main(String[] args) {

    //动态代理—JDK动态代理

    JDKHandlerProxy jdkHandlerProxy=new JDKHandlerProxy(new OrderServiceImpl());

    OrderService proxy = jdkHandlerProxy.getProxy();

    proxy.order();

    }

    }

  •  

  • cglib实现动态代理
    • /* cglib实现动态代理,使用之前需要引入maven依赖

      */

      public class CglibMethodInterceptor implements MethodInterceptor {

      @Override

      public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

      System.out.println(">>>日志收集开始>>>>");

      Object o1 = methodProxy.invokeSuper(o, objects);

      System.out.println(">>>日志收集结束>>>>");

      return o1;

      }

      }

      public class ClientTest {

       

      public static void main(String[] args) {

      //动态代理-cglib动态代理

      CglibMethodInterceptor cglibMethodInterceptor=new CglibMethodInterceptor();

      Enhancer enhancer=new Enhancer();

      enhancer.setSuperclass(OrderServiceImpl.class);

      enhancer.setCallback(cglibMethodInterceptor);

      OrderService o =(OrderService) enhancer.create();

      o.order();

      }

      }

                                   -------------------------------------------------------------------------本文内容参考蚂蚁课堂精讲设计模式系列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值