(Git地址:https://github.com/USuperMe/ProxyModel.git)
(原文地址: http://mp.weixin.qq.com/s/RQRSiXJJmbsLFUJuzcH4eQ )
今天分享设计模式中的代理模式,我觉得就是月老担任的职责。不过貌似今天是个特殊的日子,没办法,刚好学到这一章,作为一个20余年的老汪,我觉得没必要出去瞎转悠,老老实实的 码码码...............
什么是代理模式:呐,百度百科是这么解释的:代理模式由三个部分组成,抽象角色、代理角色和真实角色。
抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法
真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
一脸懵逼,说的这么官腔,谁听得懂,咳咳,我来解释一下,我以为的代理模式大概就是这样:有三个对象A B C,玩cosplay,每个人扮演不同的角色,A对象觉得C对象cos的不错,想要认识一下C对象(殊不知,C对象是个基佬),但是A对象和C对象之间没有任何的联系(微信要不到、电话要不到),干着急。这个时候,B对象站出来了,B对象是A对象的哥们,他认识C对象,C对象刚好也认识B,这不,事就好办了,A对象就可以委托B对象办事了,B对象也顺理成章的当上月老,牵桥搭线。
犊子就扯这么多,看看代理模式都有哪些种类:
-
远程代理,即为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。
-
虚拟代理,根据需求需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象
-
安全代理,用来控制真实对象的访问权限,一般,一个对象想要访问另外一个对象,需要有不同的权限。
-
智能指引,当调用真实对象时,代理处理另外一些事。
ok。文字大概就这么多,来点代码压压惊:
1.首先实现一个抽象角色类:
2.实现ACos类,继承自抽象基类:
3.实现BCosPlayer,定义月老:
4.实现CCosPlayer类,这是一个基佬:
好了,两个对象就在B的协调下联系上了。来看下客户端的调用代码吧:
完美实现输出,A对象不直接与C对象接触,通过B对象去代理完成,避免惨遭拒绝的尴尬。看下运行结果:
这就是代理模式的好处,我所理解的是:Acos想要了解Ccos,但是Acos并不认识Ccos,Ccos也不认识Acos,同事,Acos可能有些信息并不想直接告诉Ccos,所以,就需要Bcos 出来代理了。在网络跨域访问时,代理就起到很大的作用。比如,翻墙、VPN之类的。
OK,代理模式,就码这么多,get到就赶快用到项目中去吧。看完,点赞的,明年不用过双十一。