在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
在星空里面最常见的代理模式,应该属代理字段。代理字段具有原字段的值的相关属性功能,仅暴露出了可见、样式等差异,不仅在布局上便与表体展示,也方便了字段归类。
成为一名资深研发,怎么能不完全掌握代理模式呢?先掌握一个简单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编程的结构思想。
三、思考与总结
目前星空中实现的还是以具有实际代理类,在苍穹java技术栈中,会有jdk和cglib提供的动态代理而实现的动态代理;
结构性的设计模式还有哪些,比较常用。