当前位置:首页 > CN2资讯 > 正文内容

设计模式(八)静态代理与动态代理模式静态代理和动态代理

10小时前CN2资讯

代理(Proxy)设计模式简介:

提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.
这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法
举个例子来说明代理的作用:假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解决.这就是代理思想在现实中的一个例子

静态代理:

静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类.

class Program { static void Main(string[] args) { Member member = new Member() { Id=1,Name="test member"}; IMemberService baseMemberService = new MemberServiceImpl(); //代理原有业务类 MemberSerivceImplStaticProxy memberService = new MemberSerivceImplStaticProxy(baseMemberService); //遵守接口契约 string result = memberService.Create(member); System.Console.WriteLine(result); System.Console.ReadKey(); } } class Member { public int Id { get; set; } public String Name { get; set; } public override string ToString(){ return string.Format("Member[Id={0},Name={1}]", this.Id, this.Name); } } interface IMemberService { string Create(Member member); } class MemberServiceImpl : IMemberService { public string Create(Member member){ Console.WriteLine("create member:"+member); return "SUCCESS"; } } class MemberSerivceImplStaticProxy { private IMemberService target; public MemberSerivceImplStaticProxy(IMemberService target) { this.target = target; } public string Create(Member member){ before(member); string result= target.Create(member); after(member); return result; } private void before(Member member){ Console.WriteLine("before " + member); } private void after(Member member){ Console.WriteLine("after " + member); } }

动态代理:

动态代理有以下特点:
1.代理对象,不需要实现接口
2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
3.动态代理也叫做:JDK代理,接口代理

class Program { static void Main(string[] args) { Member member = new Member() { Id=1,Name="test member"}; IMemberService baseMemberService = new MemberServiceImpl(); //代理原有业务类 IMemberService memberService = (IMemberService)new MemberServiceImplDynamicProxy(baseMemberService).GetTransparentProxy(); //遵守接口契约 string result = memberService.Create(member); System.Console.WriteLine(result); System.Console.ReadKey(); } } class Member { public int Id { get; set; } public String Name { get; set; } public override string ToString(){ return string.Format("Member[Id={0},Name={1}]", this.Id, this.Name); } } interface IMemberService { string Create(Member member); } class MemberServiceImpl : IMemberService { public string Create(Member member){ Console.WriteLine("create member:"+member); return "SUCCESS"; } } class MemberServiceImplDynamicProxy : System.Runtime.Remoting.Proxies.RealProxy { private IMemberService target; public MemberServiceImplDynamicProxy(IMemberService target) : base(typeof(IMemberService)){ this.target = target; } public override System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage msg){ System.Runtime.Remoting.Messaging.IMethodCallMessage callMessage = (System.Runtime.Remoting.Messaging.IMethodCallMessage)msg; Member member = callMessage.Args[0] as Member; before(member); object returnValue = callMessage.MethodBase.Invoke(this.target, callMessage.Args); after(member); return new System.Runtime.Remoting.Messaging.ReturnMessage(returnValue, new object[0], 0, null, callMessage); } private void before(Member member){ Console.WriteLine("before " + member); } private void after(Member member){ Console.WriteLine("after " + member); } }

 为了让动态代理类更通用,可以对其调整为如下:

class DynamicProxyFactory : System.Runtime.Remoting.Proxies.RealProxy { private object target; public DynamicProxyFactory(object target, Type targetType) : base(targetType) { this.target = target; } public override System.Runtime.Remoting.Messaging.IMessage Invoke(System.Runtime.Remoting.Messaging.IMessage msg) { System.Runtime.Remoting.Messaging.IMethodCallMessage callMessage = (System.Runtime.Remoting.Messaging.IMethodCallMessage)msg; before(this.target); object returnValue = callMessage.MethodBase.Invoke(this.target, callMessage.Args); after(this.target); return new System.Runtime.Remoting.Messaging.ReturnMessage(returnValue, new object[0], 0, null, callMessage); } private void before(object member) { Console.WriteLine("before " + member); } private void after(object member) { Console.WriteLine("after " + member); } }

对应客户端调用时也要变,变为如下:

class Program { static void Main(string[] args) { Member member = new Member() { Id = 1, Name = "test member" }; IMemberService baseMemberService = new MemberServiceImpl(); //代理原有业务类 IMemberService memberService = (IMemberService)new DynamicProxyFactory(baseMemberService, typeof(IMemberService)).GetTransparentProxy(); //遵守接口契约 string result = memberService.Create(member); System.Console.WriteLine(result); System.Console.ReadKey(); } }

基础才是编程人员应该深入研究的问题,比如:
1)List/Set/Map内部组成原理|区别
2)mysql索引存储结构&如何调优/b-tree特点、计算复杂度及影响复杂度的因素。。。
3)JVM运行组成与原理及调优
4)Java类加载器运行原理
5)Java中GC过程原理|使用的回收算法原理
6)Redis中hash一致性实现及与hash其他区别
7)Java多线程、线程池开发、管理Lock与Synchroined区别
8)Spring IOC/AOP 原理;加载过程的。。。
+加关注】。

    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24460.html

    分享给朋友:

    “设计模式(八)静态代理与动态代理模式静态代理和动态代理” 的相关文章

    全球主机交流:共享经验与技术的最佳平台

    全球主机交流是一个汇聚了各种关于虚拟主机、VPS、服务器和域名等话题的社区。在这样的环境中,全球各地的主机爱好者可以自由地交流经验、分享知识,讨论技术问题。而这样的交流不仅限于技术和使用问题,更多的是对一个不断发展的技术领域的探索。用户在这里可以找到适合自己的主机服务,同时也能够和其他人分享使用心得...

    VPS重装系统的详细步骤与最佳实践

    在管理VPS时,有时会需要进行系统重装。VPS重装系统是指对虚拟专用服务器(Virtual Private Server)的操作系统进行全面重置和重新安装的过程。它可以帮助解决一些由于系统故障、配置错误或其他原因引发的问题。对于我来说,了解这一过程至关重要,可以让我更好地维护和管理我的服务器。 当我...

    ChicagoVPS 测评:性能、价格与客户服务的全面分析

    在开始谈论ChicagoVPS之前,我想分享一些关于它的背景故事。ChicagoVPS成立于2010年,源于对高效和可靠的虚拟专用服务器(VPS)的需求。作为一家快速崛起的公司,它在短短几年内就积累了相当可观的用户基础。它在美国中西部的沃土上发展壮大,吸引了不少希望获得优质服务的用户。公司的愿景是提...

    跑步的全面指南:基础知识、路线选择与心理技巧

    跑步的基础知识 跑步,这项简单又有效的运动,拥有着悠久的历史和丰富的文化背景。追溯到古代,跑步不仅是人类生存的必要技能,更是一项重要的竞技活动。历史上,古希腊的奥林匹克运动会中,长跑是最受欢迎的项目之一。而在中国,长跑也早在古代就已经成为士兵训练和民间竞技的一部分。随着时代发展,跑步逐渐演变为一种大...

    2024年RackNerd在纽约的主机服务优势与促销活动分析

    RackNerd简介 RackNerd 是一家在美国知名的主机商,以其稳定的虚拟主机、KVM VPS、Hybrid Dedicated Servers和独立服务器租用方案而备受青睐。公司成立以来,致力于为全球用户提供高性能、可靠性强的服务器解决方案。对于我来说,RackNerd的服务不仅包括针对个人...

    Cloudflare域名解析教程:轻松设置与优化网站性能

    在网络安全和性能优化方面,Cloudflare无疑是一个备受青睐的选择。它不仅为网站提供了强大的DNS解析服务,还有助于提升访问速度和保护网站免受各类网络攻击。我在使用Cloudflare的过程中,逐渐了解了什么是Cloudflare以及它的多种功能和优势。 首先,我们需要知道Cloudflare是...