一起谈.NET技术,系统架构技能之设计模式—代理模式

简介:   一、上篇回顾  很久没有更新设计模式系列的文章了,有了很多热心朋友的反馈,我决定继续将这个系列赶快写完,最近由于过年了,有很多相关的事宜要做,所以没有时间来写,也是对大家的说下抱歉,感觉写文章的时间越来越少了,不过我会努力,尽快将这个系列写完,与大家共勉,希望大家有什么意见或建议,都可以帮我提出来,我好改进,谢谢!。

  一、上篇回顾

  很久没有更新设计模式系列的文章了,有了很多热心朋友的反馈,我决定继续将这个系列赶快写完,最近由于过年了,有很多相关的事宜要做,所以没有时间来写,也是对大家的说下抱歉,感觉写文章的时间越来越少了,不过我会努力,尽快将这个系列写完,与大家共勉,希望大家有什么意见或建议,都可以帮我提出来,我好改进,谢谢!。

  本文主要是讲述设计模式中的结构性模式中的最后一个本系列讲述的模式,也是经常用到的模式,代理模式,由于目前我们在很多的技术中都会用到这个代理模式,所以对我们来说,代理模式是必须掌握的模式之一。我们先来看看代理的思路及原理:       image

  通过上面的图片,我们可以看到,通过增加代理来解耦A与C之间的调用,这样可以封装原来C调用A的一些相关细节,转换成C直接调用B中封装后的代理方法,则等同于访问A。对于WebService的远程调用时,如果我们使用添加Web引用的方式,那么WebService会为我们自动生成代理类的,这个我这里就不演示了,包括Castle中的AOP等实现方案都是基于动态代理的机制来实现,当然思路都是这样的,WCF中也有用到代理的思想。

  二、摘要

  前面我们讲述了外观模式中的关于动态代理中的一些实现,当然代理模式与外观模式的侧重点还是有所不同,外观模式是将众多细粒度的功能,封装成一个粗粒度的功能,供客户应用程序使用。而代理模式,为其他对象提供一个代理类,通过该代理类来完成目标对象的访问,代理模式相对外观模式来说,关键不同是在内部,外观我们知道是将细粒度的功能进行简单封装,而代理模式则是内部实现很复杂,其复杂性主要体现在来自如下的几类复杂性:         image

  可能上述的复杂性还不完整,例如还可能有目前的比较新兴的大数据量的虚拟代理或者是智能代理,这方面由于自身不足,所以还无法讲述。

  本文将会结合举例说明上述的几类代理的复杂性的简单说明,希望能说明清楚。

  三、本文大纲

       a、上篇回顾。

       b、摘要。

       c、本文大纲。

       d、代理模式的特点及使用场景。

       e、代理模式的经典实现。

       f、代理模式的其他方案。

       g、代理模式使用总结。

       h、系列进度。

       i、下篇预告。

  四、代理模式的特点及使用场景

  我们先来看看代理模式的特点及使用场景吧,我们先来看看一个简单的场景吧:

      我们现在要构建一个分布式应用程序,那么一般在.NET平台下,我们一般会采用WCF或者WebService的方式来发布应用,不管是平时大家听说的SOA架构的实现,还是其他的ESB总线架构等,也无非是二种实现方式,一种是通过API接口编程来实现,通过WCF的Remoting或者是其他的方式来调用远程服务,另一种是通过WebService的形式来发布服务,那么既然有了发布服务之后,那么我们之后的操作可能更多关心的是,如果在客户端使用这个服务,那么一般我们可能采用的最常用的方式,就是在客户端由平台自动生成一个代理或者我们自己写一个代理类,当然这个代理类可以是通用的代理类或者是为某些服务单独写代理,能够更方便的使用及提升效率等。

      通过上面的说明,那么我们现在基本上知道了,代理模式的作用体现在哪里,下面我们来详细展开说明吧;当我们的一个服务写的很复杂,但是我们在客户端调用的时候,我们又不希望在客户端使用起来太复杂,这个时候,可能我们想我们通过使用代理类,那么通过代理类,这个客户端与远程的服务类进行交互过程就变成客户端与代理类的交互,那么给客户的感觉就像服务类就在本地一样,这样不但降低了复杂性,而且也降低了耦合性。

      那么一般代理类有什么要求呢?一般来说代理对象必须实现目标对象定义的一些接口,只有这样,客户端应用程序在使用的时候,通过接口调用来访问目标对象的服务,否则就等于引入复杂度,反而没有解决问题。

      使用代理的目的是控制客户端程序访问目标对象,因此代理必须知道目标对象的类型及目标对象在哪里,如何访问等都必须明确。

      代理对象有的时候也可以是抽象类型,这样目标类型就可以是未确定的,我们可以通过创建型模式来动态的创建目标对象,当然前提是这些目标对象是代理对象类型。

  五、代理模式的经典实现

  下面给出代理模式的经典实现:

  我们以如下场景为例,我们现在要实现一个MP3播放的相关功能,一般来说有很多的音频文件;

  下面我们来看看如何使用代理模式来实现。

       (1)、定义客户端调用的具体的音乐媒体类型类型。                image

        (2)、定义客户端调用的目标对象的接口。          image

        (3)、定义具体的目标类型的实现。         image

        (4)、定义代理类,该代理类实现了目标类型的接口。                image

         (5)、具体的客户端调用。                image

   上面基本上给出了一个简单的例子说明,当然具体的代理模式的思路就是这样了,当然参考上面的类图来做的话,和我的这个形式差不多,具体的思想就是为目标类型定义一个接口,然后代理类实现该接口,那么在代理类中指定具体的目标类型的调用,完成目标类型的调用,返回调用后的结果,那么就等于代理类封装了目标类型的调用。

  六、代理模式的其他实现方案

  上面我们给出了代理模式的经典实现方案,那么我们本节看看其他的实现方案,来扩展下我们的方案的使用场景及一些其他的应用场景的情况:

  我们给出WebService的示例过程吧:

      (1)、 为了说明我们给出的示例过程,我们来新建一个ASP.NET WEB应用程序网站,添加一个WebService服务文件。       image

      (2)、 选择添加一个WebService文件。image

     (3)、添加完后,修改HelloWord方法,添加一个name字段,代表输入字符串,输出相应的代码。  image

      (4)、添加完毕后,在浏览器中查看。image

      (5)、测试,是否服务正确。运行后的结果应该如下:         image

  置于其他的相应的信息我就补贴出来了,然后我们将webservice服务发布出来,通过二种形式来添加代理。

  1、通过web引用的形式:

  (1)、先找到webservice服务的发布地址

image

  (2)、复制地址,并且在要引用该webservice服务的项目中在引用文件夹中点击右键。

image

  (3)、将复制的地址,输入到服务引用的地址栏中。

image

  (4)、点击前往,系统就会自动与webservice建立测试连接。

image

  如果没有出现上述的服务内容,那么则可能服务没有发布,或者服务的引用添加的路径不对等。点击确定,这个时候,我们来看看代理文件生成的内容:

image

  我们来看看系统为我们自动生成的WEB服务代理的代码吧:

  通过reflactor中的对象浏览器来查看系统生成的内容吧:

image

  具体的代码太多了,我这里就不贴出了,大家可以看看,我这里给出解析webservice的一些通用的统一代理代码。

image

image

  这样就完成通用的Get请求的方式来调用webservice服务。

  七、代理模式使用总结

  通过上面的webservice的讲述,我想大家对代理模式还是会有些陌生,其实代理模式我们前面也说道,代理是将目标对象的复杂性进行封装,通过代理来完成调用,那么我们针对前面的客户端调用的目标类型的接口定义,并且目标对象要实现这个接口,代理类也要实现这个接口。

  下面来总结下代理模式与外观模式的区别:

  1、外观模式也是屏蔽复杂性的,但是外观模式不会实现客户端调用的目标类型接口。

  2、一般客户端调用外观模式的方法都是直接调用。

  3、代理模式中对客户端目标对象类型抽象接口具体化了。

  4、外观模式是代理模式中一种特殊的子级模式(广泛的,非约束性)。

  针对前面我们提到过,代理模式中还有将代理类定义成抽象类型,然后完成动态的调用的情况,那么我们看看我们如何来组织呢?

  1、定义多个播放文件格式对象:

image

  新增加上述的3个文件。

  2、修改playProxy的代码如下:

image

  3、具体的代理代码如下:这里参考AOP的实现机制。

image

  4、具体的调用代码如下:

image

  当然这里的具体的调用过程还有很多方法可以进行改进的更好,比如在内部的枚举模式,修改成创建工厂的形式来完成对象的动态创建及调用等。我这里就不进行优化了,只是展示出思路和方案,希望大家提出不同的意见!

目录
相关文章
|
7天前
|
运维 持续交付 API
从零构建微服务架构:一次深度技术探索之旅####
【10月更文挑战第28天】 本文记录了作者在从零开始构建微服务架构过程中的深刻技术感悟,通过实战案例详细剖析了微服务设计、开发、部署及运维中的关键要点与挑战。文章首先概述了微服务架构的核心理念及其对企业IT架构转型的重要性,随后深入探讨了服务拆分策略、API网关选型、服务间通信协议选择、容器化部署(Docker+Kubernetes)、以及持续集成/持续部署(CI/CD)流程的设计与优化。最后,分享了在高并发场景下的性能调优经验与故障排查心得,旨在为读者提供一套可借鉴的微服务架构实施路径。 ####
41 3
|
18天前
|
边缘计算 Cloud Native 安全
构建灵活高效的下一代应用架构 随着企业数字化转型的加速,云原生技术正逐渐成为构建现代化应用程序的关键支柱。
随着企业数字化转型加速,云原生技术逐渐成为构建现代化应用的关键。本文探讨了云原生的核心概念(如容器化、微服务、DevOps)、主要应用场景(如金融、电商、IoT)及未来发展趋势(如无服务器计算、边缘计算、多云架构),并分析了面临的挑战,如架构复杂性和安全问题。云原生技术为企业提供了更灵活、高效的应用架构,助力数字化转型。
42 4
|
15天前
|
Kubernetes Cloud Native 持续交付
云端新纪元:云原生技术重塑IT架构####
【10月更文挑战第20天】 本文深入探讨了云原生技术的兴起背景、核心理念、关键技术组件以及它如何引领现代IT架构迈向更高效、灵活与可扩展的新阶段。通过剖析Kubernetes、微服务、Docker等核心技术,本文揭示了云原生架构如何优化资源利用、加速应用开发与部署流程,并促进企业数字化转型的深度实践。 ####
|
2天前
|
Kubernetes Cloud Native 云计算
云原生技术深度解析:重塑企业IT架构的未来####
本文深入探讨了云原生技术的核心理念、关键技术组件及其对企业IT架构转型的深远影响。通过剖析Kubernetes、微服务、容器化等核心技术,本文揭示了云原生如何提升应用的灵活性、可扩展性和可维护性,助力企业在数字化转型中保持领先地位。 ####
|
3天前
|
存储 分布式计算 分布式数据库
风险数据集市整体架构及技术实现
【11月更文挑战第11天】在当今大数据时代,风险数据集市作为金融机构的核心基础设施之一,扮演着至关重要的角色。它不仅为银行、保险等金融机构提供了全面、准确的风险数据支持,还帮助这些机构实现了风险管理的精细化和智能化。本文将深入探讨一种基于大数据Lambda架构设计的风险数据集市整体架构,并详细介绍其底层实现原理及实现方式。
15 3
|
6天前
|
机器学习/深度学习 人工智能 自然语言处理
医疗行业的语音识别技术解析:AI多模态能力平台的应用与架构
AI多模态能力平台通过语音识别技术,实现实时转录医患对话,自动生成结构化数据,提高医疗效率。平台具备强大的环境降噪、语音分离及自然语言处理能力,支持与医院系统无缝集成,广泛应用于门诊记录、多学科会诊和急诊场景,显著提升工作效率和数据准确性。
|
12天前
|
监控 安全 Serverless
"揭秘D2终端大会热点技术:Serverless架构最佳实践全解析,让你的开发效率翻倍,迈向技术新高峰!"
【10月更文挑战第23天】D2终端大会汇聚了众多前沿技术,其中Serverless架构备受瞩目。它让开发者无需关注服务器管理,专注于业务逻辑,提高开发效率。本文介绍了选择合适平台、设计合理函数架构、优化性能及安全监控的最佳实践,助力开发者充分挖掘Serverless潜力,推动技术发展。
32 1
|
19天前
|
运维 Cloud Native 持续交付
云原生技术在现代IT架构中的深度应用与挑战####
【10月更文挑战第17天】 本文深入剖析了云原生技术的精髓,探讨其在现代IT架构转型中的核心作用与面临的挑战。云原生不仅是一种技术实现,更是企业数字化转型的重要推手,通过容器化、微服务、持续集成/持续部署(CI/CD)等关键要素,重塑软件开发、部署与运维模式。文章首先概述了云原生的基本原则与核心组件,随后分析了其如何促进企业敏捷性、可扩展性和资源利用率的提升,同时也指出了在安全性、复杂性管理及人才技能匹配等方面存在的挑战,并提出了相应的对策建议。 ####
55 6
|
21天前
|
Cloud Native API 持续交付
利用云原生技术优化微服务架构
【10月更文挑战第13天】云原生技术通过容器化、动态编排、服务网格和声明式API,优化了微服务架构的可伸缩性、可靠性和灵活性。本文介绍了云原生技术的核心概念、优势及实施步骤,探讨了其在自动扩展、CI/CD、服务发现和弹性设计等方面的应用,并提供了实战技巧。
|
18天前
|
运维 Kubernetes 开发者
构建高效后端服务:微服务架构与容器化技术的结合
【10月更文挑战第18天】 在数字化转型的浪潮中,企业对后端服务的要求日益提高,追求更高的效率、更强的可伸缩性和更易于维护的系统。本文将探讨微服务架构与容器化技术如何结合,以构建一个既灵活又高效的后端服务体系。通过分析当前后端服务面临的挑战,介绍微服务和容器化的基本概念,以及它们如何相互配合来优化后端服务的性能和管理。本文旨在为开发者提供一种实现后端服务现代化的方法,从而帮助企业在竞争激烈的市场中脱颖而出。
21 0
下一篇
无影云桌面