随处可见的设计模式——代理模式原创
金蝶云社区-MiLai
MiLai
9人赞赏了该文章 730次浏览 未经作者许可,禁止转载编辑于2020年07月16日 13:41:00

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

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




在星空里面最常见的代理模式,应该属代理字段。代理字段具有原字段的值的相关属性功能,仅暴露出了可见、样式等差异,不仅在布局上便与表体展示,也方便了字段归类。


image.png

成为一名资深研发,怎么能不完全掌握代理模式呢?先掌握一个简单demo,



//定义一个需要显示图片的接口
public interface Image {
   void display();}
//用于实现真实意图的展示图片
public class RealImage : Image {
 
   private String fileName; 
   public RealImage(String fileName){
      this.fileName = fileName;      
      loadFromDisk(fileName);   
   }
 
   public void display() {
      Console.WriteLine("Displaying " + fileName);   
   }
 
   private void loadFromDisk(String fileName){
      Console.WriteLine("Loading " + fileName);   
   }
}
//创建代理类
public class ProxyImage : Image {
 
   private RealImage realImage;   
   private String fileName; 
   public ProxyImage(String fileName){
      this.fileName = fileName;   
   }
   //代理RealImage
   public void display() {
      if(realImage == null){
         realImage = new RealImage(fileName);      
      }
      realImage.display();   
   }
}
//示例
public class ProxyPatternDemo {
   
   public static void main(String[] args) {
      Image image = new ProxyImage("test_10mb.jpg"); 
      // 图像将从磁盘加载
      image.display();  
   }
}

从上面的示例可以看出,本来Image简单实现以下display的方法,new出对象,就可以完成的展示图片方法,为什么要做这种脱裤子放屁的事情呢?不仅需要写那么多代码,还不容易理解。


一、介绍

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

主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。

优点: 1、职责清晰。 2、高扩展性。 3、智能化。

缺点: 1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。 2、实现代理模式需要额外的工作,有些代理模式的实现非常复杂。



二、星空中的代理模式

星空作为典型的MVC架构,少不了视图与模型,操作与视图之间的交互。我们在做值更新的时候,同时必须改变模型数据包里面的内容,在点击保存等操作的时候,需要把数据持久化到数据库中,操作干预的时候甚至对每项操作都实现了一些干预,特别作为开发,我们能深刻感受到,自己在override每一个基类模板方法的时候,就是在干预某一件事情。



通版提供几个用于视图、模型、表单构建的动态代理插件,便于干预进行二开,在必要的时候,只要循环遍历一下我们在BOS表单里面挂在的插件,执行方法,就实现了二开干预。

简单的一个代理实现,就把插件二开相关的业务外包给了代理插件。当然泛型抽象基类也帮助了我们基本插件干预,包括性能统计、日志跟踪,这样也实现了一个切面AOP编程的结构思想。



三、思考与总结


  1. 目前星空中实现的还是以具有实际代理类,在苍穹java技术栈中,会有jdk和cglib提供的动态代理而实现的动态代理;

  2. 结构性的设计模式还有哪些,比较常用。

赞 9