欢迎来到天天文库
浏览记录
ID:30768462
大小:523.77 KB
页数:16页
时间:2019-01-03
《java-android设计模式学习笔记(9):代理模式-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、java/android设计模式学习笔记(9):代理模式-编程开发技术java/android设计模式学习笔记(9):代理模式原文出处:Shawn_Dut这篇博客我们来介绍一下代理模式(ProxyPattern),代理模式也成为委托模式,是一个非常重要的设计模式,不少设计模式也都会有代理模式的影子。代理在我们日常生活屮也很常见,比如上网吋连接的代理服务器地址,更比如我们平时租房子,将找房子的过程代理给中介等等,都是代理模式在F1常生活中的使用例了。代理模式屮的代理对象能够连接任何事物:一个网络连接,一个山用很多内存的大对彖,一个文件,或者是一些复制起来代
2、价很高甚至根本不可能复制的一些资源。总之,代理是一个由客户端调用去访问幕后真正服务的包装对象,使用代理口J以很容易地转发到真正的对象上,或者在此基础上去提供额外的逻辑。代理模式中也可以提供额外的功能,比如在资源集中访问操作时提供缓存服务,或者在操作真正执行到对象Z前进行前捉条件的检查。对丁•客户端来说,使用代理对彖,和使用真正的对彖其实是类似的,因为他们都实现了同样的接口。PS:对技术感兴趣的同鞋加群544645972-起交流。设计模式总目录java/android设计模式学习笔记目录特点代理模式为另一个对象提供一个代理以控制对这个对象的访问。使用代理模
3、式创建代理,让代理对象控制对某个对象的访问,被代理的对象可以是远程的对象,创建开销很大的对象,或者是需要安全控制的对象,所以代理模式的使用场景为:当无法或者不想直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端的透明性,委托对象与代理对象需耍实现同样的接口。代理模式可以大致分为静态代理和动态代理。静态代理模式的代码由程序员自己或通过一些自动化工具生成固定的代码再对其进行编译,也就是说我们的代码在运行前代理类的class编译文件就已经存在;而动态代理则与静态代理和反,在Java或者Android中通过反射机制动态地生成代
4、理者的对象,也就是说我们在code阶段完全不需要知道代理谁,代理谁我们将会在执行阶段决定,在Java中,也提供了相关的动态代理接口InvocationHandler类,这个我们在后面源码的时候会用到。代理模式根据实际使用的场景也可以分为以下儿种:•远程代理(RemoteProxy):为某个在不同的内存地址空间的对象提供局部代理,使系统可以将Server部分的实现隐藏,以便Client可以不必考虑Server的存在,类似于C/S模式(主要拦截并控制远程方法的调用,做代理防火墙之类的);•虚拟代理(VirtualProxy):使用一个代理对象标识一个十分耗资
5、源的对象,并在真正需要吋才创建,实现一个延迟加载的机制;•保护代理(ProtectionProxy):是用代理控制对原始对象的访问,该类型的代理通常被用于原始对象有不同访问权限的情况:•智能引用(SmartProxy):在访问原始対象时执行一•些自己的附加操作并対指向原始对彖的引用计数;•写时拷贝(克隆)代理(Copy-on-writeProxy):其实是虚拟代理的一个分支,提供了拷贝人对象的时候只有在对象真正变化后才会进行拷贝(克隆)的操作,即延迟拷贝。需要注意的一点是,静态和动态代理都可以应用于上述的儿种情形,两者是各口独立变化的。UML类图我们来看
6、看代理模式的uml类图:据此我们口J以写出代理模式的通用代码:Subject,classpublicabstractclassSubject{publicabstractvoidoperation();}RealSubject.classpublicclassRcalSubjcctextendsSubject{©Overridepublicvoidoperation(){//therealoperationProxySubject・classpublicclassProxySubjectextendsSubject{privateSubjectrealS
7、ubject;publicProxySubject(SubjectrealSubject){this.realSubject二realSubject;}©Overridepublicvoidoperation(){if(realSubject!二null){realSubject・operation();}else{//dosomethingelse}}}客户端Client代码ProxySubjectsubject二newProxySubject(newRealSubject());subject.operation();代理模式的角色:oSubject
8、:抽象主题类该类的主要职责是声明真实主题与代理的共同接口方法,该类既可以是一个抽
此文档下载收益归作者所有