代理模式

93 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情

代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。

在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

作用:为其他对象提供一种代理以控制对这个对象的访问。

目的: 想在访问一个类时做一些控制,比如打印日志

代理模式代码,代理对象持有一个被代理的实例,当使用者调用对象方法时由代理调用持有的对象方法,在调用前后可以做其他的事情。

public class ProxyImage implements Image{
 
   private RealImage realImage;
   private String fileName;
 
   public ProxyImage(String fileName){
      this.fileName = fileName;
   }
 
   @Override
   public void display() {
      if(realImage == null){
         realImage = new RealImage(fileName);
      }
      realImage.display();
   }
}
模式区别
  1. 和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理模式不能改变所代理类的接口。
  2. 和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制,做点其他的事。
静态代理、动态代理

静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类。

静态代理需要编写代理类,在编译阶段生成静态的字节码。

静态代理事先知道要代理的是什么,而动态代理不知道要代理什么东西,只有在运行时才知道。

JDK动态代理是代理的是接口,通过 Proxy 里的 newProxyInstance 得到代理对象。

动态代理 CGLIB,代理的是类,不需要业务类继承接口,通过派生的子类来实现代理。通过在运行

时,动态修改字节码达到修改类的目的。

动态代理模式的应用
  • 日志的采集
  • 权限控制 如shiro
  • 实现aop
  • Mybatis mapper
  • Spring的事务 @Transactional
  • 全局捕获异常 controlAdvice
  • Rpc远程调用接口 openFeign
  • 分布式事务原理代理数据源

\