董技叔软件软件开发公司源码哥本文为您分享,关于代理模式系统开发——就是那种在软件里头,能帮你替身办事、中间传话,或者偷偷加塞儿做点啥的技术法子——是不是好多人一听就头大?觉得这东西高深莫测,离自己十万八千里远?其实,代理模式系统开发没那么玄乎,它就像是你跟某个大爷之间的传话人、中间人,有时候你不方便直接找大爷,就得通过这个中间人来回倒腾事,对?今天,咱就一点儿一点儿地、慢悠悠地把这个代理模式系统开发给捋捋清楚,让大家心里都有个数,知道这到底是个啥东西,能干啥用,以及为啥现在企业搞系统开发都爱用这一套!
首先得说说,这个代理模式系统开发里头的“代理”到底是个啥概念,嗯哼?简单来讲,就是一个对象——咱们暂且叫它“小代”——代替另一个对象——咱们叫它“老被”——去接受别人的请求、干活儿啊。“小代”它自己可能不直接干正事,但它能控制“老被”跟外面的联系,就像个看大门的,谁能进来,谁不能进来,它得说了算!比如说你想访问一个特别特别远的服务器上的文件,直接连过去可能慢得要死,或者有时候根本连不上,这时候,要是有个“代理服务器”在中间帮你先把文件取过来存着,你再从代理服务器那儿拿,不就快多了?这个“代理服务器”它就是个代理模式的实实在在的应用干活儿的 !代理模式系统开发里头,常见的有好几种类型哦:有帮忙远程调用的远程代理,就像刚才说的那个 proxy ;有控制个啥东西能不能 的保护代理,比如有些文件不让你看,那代理就挺身而出拦着你;还有那种懒懒洋洋的,不到万不得已不创建对象的虛拟代理,省资源,对
那搞这个代理模式系统开发,到底有啥实实在在的好用处?为啥那么多搞技术的家伙姐们儿都对它念念不忘、想方设法要用上?这你就不知道了

1. 它能帮你摆平远程访问的那些破事:就像刚才举的那个 proxy 的例子一样,特别是在微服务架构里头,服务与服务之间隔得老远老远,这个代理它就能让你感觉好像在调用本地自己家的方法一样,方便得不得了!
2. 还能在事前事后偷偷做点小动作,进行工作增强一下:这个特别了不得,比如说记录一下打 log,统计一下某个方法跑了多长时间 time,给方法加个 、事务支持,在调用真正的对象之前看看你有没有 、权限够不够,各种各样意想不到的功能它都能给添上去,而不用去改那个“老被”对象自己本身的一丁点儿代码,这叫什么来着?,对!-开闭原则-,就是对扩展开发、对修改关闭,听起来就挺高级的,是不是?
3. 可以活生生延迟对象的产生和初始化:像那个虚拟代理,对于那种特别占内存、创建起来费老劲的大家 对象,先弄个代理在那儿应付着,等实在要用到的时候再真正创建正主儿出来,系统跑得快多了!

4. 能把一些乱七八糟的重复工作给摘出来,让代码干净点:比如安全检查这一类的活儿,每个对象都写一遍,不得写到手抽筋脑袋疼?让代理给统一包办了,多省心省力讨好啊是不是?
在实际着手搞这个代理模式系统开发的时候,会碰到好多种不同的实现方向和路子走。最最最简单 basic 的,就是你费劲巴力老老实实地手动写一个代理类,一字一句敲出来,完完全全实现跟目标 ;这不过,如果代理的东西特别多有好多好多,那手写代理不得写到你哭爹喊娘吐血三升?这时候,就可以用到动态代理的黑科技、歪门邪道东西了!在 Java 世界里头,有 JDK 自带的那个 proxy,专门应付 接口;还有那个老猛老猛的 CGLIB,它能直接给 class 生成代理,不用非的有 不可,灵活多变大了去了!
搞动态代理的时候,思路一般都是这么个儿流程走:
1. (先得有个目标类,就是那个“老被”,它得干点实实在在的正事,比如计算个啥东西,保存个数据啊等等等等。
2. )然后,想办法创建一个调用处理器;这个处理器它可重要了,它会定义一个叫 的东西,那个具体的代理对象它在接到方法调用“ ”的时候,就是把这调用转发给到这个处理器这里来处理的。
3. 接下来,就得通过人家提供的 API 去“造” proxy 代理对象;,比如 Java 的 Proxy.() 这个方法,它就会照着你的目标 和 call 调用处理器,给你辛辛苦苦 new 出一个代理对象出来;至于那个 CGLIB ,它是通过继承目标类的方式,然后偷偷摸摸改写()父类老被类的方法,来达到当代理的目的干活儿的。

4. 最后一步,就是用这个崭新崭新的代理对象去调用方法;你以为你在调目标老被对象的方法,其实,每一次的调用都会先经过代理对象的“法眼”审核过一遍,然后才轮到目标对象真正干活儿,或者——甚至有时候,代理它自己就把活儿给办了!
Q:那个啥,代理模式跟装饰器模式它们看着有点像,都是层层包装套一层又一层,把对象裹得严严实实的,它们俩到底有啥不一样点
A:要说这俩兄弟,从源代码 code 结构上面看,确实是有那么点儿像,都是通过 包装别的对象进行 操作——所以才容易让人懵圈是不是?But!它们俩要干的“勾当”目的 可是大相径庭、完全不一样的!装饰器模式呢 ,它主要是死乞白赖地想给咱们的对象 add 新的行为、新的功能,让对象变得更加强大、更加牛气哄哄,比如星巴克卖咖啡,加奶加糖加奶油,一杯咖啡能给你捣鼓出花儿来,功能越来越丰富越来越多;而 代理模式 Proxy 呢 它的核心关键 on 是--控制-- / ——是你让不让访问?什么情况下才让访问?如何进行访问?它关心的是这个门禁 、大管家监督的角色,保护老被对象的安全和清静,或者是替老被跑腿办事!这点一定要分开搞清楚弄明白,不然面试被问到就抓瞎掉链子
Q:我想给我的系统里头加个日志记录 的这么个功能,就是记录一下谁、在啥时候、调用咧哪个方法 ,传了些什么参数 ,返回了啥东西 value——这种情况,用 aop 面向切面编程好?还是用 proxy 代理模式闷头干好
A:这可真是个经常会让人琢磨来琢磨去、争论半天争论不休 问题!其实,AOP 这东西,它的底层 实现原理,很多时候就是依赖于动态代理 proxy 这门技术的——可以说 AOP 是一种宏观的编程 ideas 思想,而动态代理,则比较侧重于具体的 编程实现 hands-on 操作手法、是达成 AOP 的一种手段 tool!如果你的项目 小打小闹、特别 ,日志的需求也不复杂,就那么一两个地方用用,那你自己动手搭个代理模式,三下五除二就能搞定,简单直接粗暴有效,不用引入那么多乱七八糟的 框架,省事!But!如果你的系统 巨大无比,日志需求 又复杂多变,比如要打印日志的地方成百上千、散布在各个犄角旮旯,或者还想搞点什么事务 、安全 、缓存 cache 之类的 cross- 横切关注点,那果断必须毫不犹豫地上 AOP !像 AOP 这种,用起来那叫一个爽歪歪,配置一下切点在哪()、自己具体要干啥事(),就万事大吉高枕无忧了,代码里头干干净净清清爽爽,简直美滋滋!人人有站源码工厂之前碰到个案子,那时候对方就只是想要一个简单的权限校验,源码哥当时就说直接上静态代理或搞个简单的动态代理得了,很快!结果人家非要上全套 AOP 大阵仗,最后整个项目变得臃肿不堪,运行起来慢得像蜗牛别提多费劲了,唉!
总的来说,这个代理模式系统开发它是咱们搞软件设计当中、程序 code 里头-非常非常重要- 的一个 设计模式,它能让咱们的系统源码结构 更清晰、更有层次感、more 。