为什么80%的码农都做不了架构师?>>>   

一、上篇回顾

很久没有更新设计模式系列的文章了,有了很多热心朋友的反馈,我决定继续将这个系列赶快写完,最近由于过年了,有很多相关的事宜要做,所以

没有时间来写,也是对大家的说下抱歉,感觉写文章的时间越来越少了,不过我会努力,尽快将这个系列写完,与大家共勉,希望大家有什么意见或建议,

都可以帮我提出来,我好改进,谢谢!。

本文主要是讲述设计模式中的结构性模式中的最后一个本系列讲述的模式,也是经常用到的模式,代理模式,由于目前我们在很多的技术中都会用到

这个代理模式,所以对我们来说,代理模式是必须掌握的模式之一。我们先来看看代理的思路及原理:

通过上面的图片,我们可以看到,通过增加代理来解耦A与C之间的调用,这样可以封装原来C调用A的一些相关细节,转换成C直接调用B中封装后

的代理方法,则等同于访问A。对于WebService的远程调用时,如果我们使用添加Web引用的方式,那么WebService会为我们自动生成代理类的,这个

我这里就不演示了,包括Castle中的AOP等实现方案都是基于动态代理的机制来实现,当然思路都是这样的,WCF中也有用到代理的思想。

二、摘要

前面我们讲述了外观模式中的关于动态代理中的一些实现,当然代理模式与外观模式的侧重点还是有所不同,外观模式是将众多细粒度的功能,封

装成一个粗粒度的功能,供客户应用程序使用。而代理模式,为其他对象提供一个代理类,通过该代理类来完成目标对象的访问,代理模式相对外观模式来

说,关键不同是在内部,外观我们知道是将细粒度的功能进行简单封装,而代理模式则是内部实现很复杂,其复杂性主要体现在来自如下的几类复杂性:

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

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

三、本文大纲

a、上篇回顾。

b、摘要。

c、本文大纲。

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

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

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

g、代理模式使用总结。

h、系列进度。

i、下篇预告。

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

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

我们现在要构建一个分布式应用程序,那么一般在.NET平台下,我们一般会采用WCF或者WebService的方式来发布应用,不管是平时大家听

说的SOA架构的实现,还是其他的ESB总线架构等,也无非是二种实现方式,一种是通过API接口编程来实现,通过WCF的Remoting或者是其他的方式

来调用远程服务,另一种是通过WebService的形式来发布服务,那么既然有了发布服务之后,那么我们之后的操作可能更多关心的是,如果在客户端使用

这个服务,那么一般我们可能采用的最常用的方式,就是在客户端由平台自动生成一个代理或者我们自己写一个代理类,当然这个代理类可以是通用的代理

类或者是为某些服务单独写代理,能够更方便的使用及提升效率等。

通过上面的说明,那么我们现在基本上知道了,代理模式的作用体现在哪里,下面我们来详细展开说明吧;当我们的一个服务写的很复杂,但是我们

在客户端调用的时候,我们又不希望在客户端使用起来太复杂,这个时候,可能我们想我们通过使用代理类,那么通过代理类,这个客户端与远程的服务类

进行交互过程就变成客户端与代理类的交互,那么给客户的感觉就像服务类就在本地一样,这样不但降低了复杂性,而且也降低了耦合性。

那么一般代理类有什么要求呢?一般来说代理对象必须实现目标对象定义的一些接口,只有这样,客户端应用程序在使用的时候,通过接口调用来访

问目标对象的服务,否则就等于引入复杂度,反而没有解决问题。

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

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

是代理对象类型。

代理模式的类图

五、代理模式的经典实现

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

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

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

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

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

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

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

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

上面基本上给出了一个简单的例子说明,当然具体的代理模式的思路就是这样了,当然参考上面的类图来做的话,和我的这个形式差不多,具体的

思想就是为目标类型定义一个接口,然后代理类实现该接口,那么在代理类中指定具体的目标类型的调用,完成目标类型的调用,返回调用后的结果,那么

就等于代理类封装了目标类型的调用。

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

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

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

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

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

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

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

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

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

1、通过web引用的形式:

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

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

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

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

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

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

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

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

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

七、代理模式使用总结

通过上面的webservice的讲述,我想大家对代理模式还是会有些陌生,其实代理模式我们前面也说道,代理是将目标对象的复杂性进行封装,通过代理来

完成调用,那么我们针对前面的客户端调用的目标类型的接口定义,并且目标对象要实现这个接口,代理类也要实现这个接口。

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

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

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

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

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

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

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

新增加上述的3个文件

2、修改playProxy的代码如下:

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

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

当然这里的具体的调用过程还有很多方法可以进行改进的更好,比如在内部的枚举模式,修改成创建工厂的形式来完成对象的动态创建及调用等。我这里就

不进行优化了,只是展示出思路和方案,希望大家提出不同的意见!

八、系列进度

创建型

1、系统架构技能之设计模式-单件模式

2、系统架构技能之设计模式-工厂模式

3、系统架构技能之设计模式-抽象工厂模式

4、系统架构技能之设计模式-创建者模式

5、系统架构技能之设计模式-原型模式

结构型

1、系统架构技能之设计模式-组合模式

2、系统架构技能之设计模式-外观模式

3、系统架构技能之设计模式-适配器模式

4、系统架构技能之设计模式-桥模式

5、系统架构技能之设计模式-装饰模式

6、系统架构技能之设计模式-享元模式

7、系统架构技能之设计模式-代理模式

行为型

1、系统架构技能之设计模式-命令模式

2、系统架构技能之设计模式-观察者模式

3、系统架构技能之设计模式-策略模式

4、系统架构技能之设计模式-职责模式

5、系统架构技能之设计模式-模板模式

6、系统架构技能之设计模式-中介者模式

7、系统架构技能之设计模式-解释器模式

九、下篇预告

下一篇我们将开始讲述行为型模式中的“命令模式”该模式是比较常用的模式,也是大众化的模式,希望能给大家说明清楚,对我自身来说也是一个

不小的挑战,欢迎大家拍砖。

原文链接: http://www.cnblogs.com/hegezhou_hot/archive/2011/02/20/1958965.html

转载于:https://my.oschina.net/dtec/blog/43759

设计模式系列-代理模式相关推荐

  1. JavaScipt设计模式初探-代理模式(三) 虚拟代理

    文章目录 前言 一.举例_图片懒加载 二.虚拟代理在示例中的体现 总结 前言 虚拟代理是代理模式在性能方面的分支, 个人认为有点像人工异步操作. 把累活和细活从真实对象拆出来丢给代理对象, " ...

  2. 【设计模式】代理模式 ( 动态代理 | 模拟 Java 虚拟机生成对应的 代理对象 类 )

    文章目录 前言 一.模拟 JVM 生成对应的 代理对象 二.模拟 JVM 生成对应的 代理对象 完整流程展示 1.目标对象接口 2.被代理对象 3.调用处理程序 4.模拟 JVM 生成的代理对象类 5 ...

  3. C++设计模式之代理模式

    这篇文章主要介绍了C++设计模式之代理模式,本文讲解了什么是代理模式.代理模式的使用场合.代理模式的实现代码等内容,需要的朋友可以参考下 前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就 ...

  4. python中代理模式分为几种_Python设计模式之代理模式实例详解

    本文实例讲述了Python设计模式之代理模式.分享给大家供大家参考,具体如下: 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 #!/usr/bin/env py ...

  5. 设计模式笔记——代理模式

    设计模式笔记--代理模式 代理模式介绍 代理模式通常是介于请求方和提供方的一个中介系统,请求方是发送请求的一方,提供方是根据请求提供相应资源的一方 Web中的代理服务器就是一个例子,客户端向代理服务器 ...

  6. 「设计模式(五) - 代理模式」

    「设计模式(五) - 代理模式」 一.处处可见的"代理" "代理"在平常生活司空见惯,点外卖,租房子找中介,买飞机票等等.基本上用手机就能完成,也就是不直接接触 ...

  7. Javascript 设计模式之代理模式【讲师辅导】-曾亮-专题视频课程

    Javascript 设计模式之代理模式[讲师辅导]-969人已学习 课程介绍         随着 javascript ES6/7 的发布,很多老版本的设计模式的实现,今天来看是错误的,将被彻底. ...

  8. 设计模式之一代理模式

    代理模式(代理设计模式) 代理模式的定义与特点 代理模式的结构与实现 代理模式(代理设计模式) 在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代 ...

  9. 23种设计模式7_代理模式之一静态代理

    23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...

最新文章

  1. 爱情第五课,终极选择题
  2. 编程之美-俄罗斯方块游戏方法整理
  3. PPT 下载 | 龙创悦动游臣隽:数据在游戏行业的落地应用实践
  4. 深入理解PHP的运行模式
  5. 大肠结构笔记(持续更新中)
  6. grafana 创建仪表盘_创建仪表盘前要问的三个问题
  7. Cloud一分钟 | 电商月将至,腾讯云DCDB助力电商企业应对支付洪峰
  8. python运行外部程序_在Python中运行外部程序(可执行文件)?
  9. 蓝桥杯第六届省赛JAVA真题----生命之树
  10. 说说关于JVM三色标记算法
  11. 排序算法浅析(一)比较排序算法
  12. Echarts数据可视化series-map地图,开发全解+完美注释
  13. win7一直显示正在关机_windows8.1和windows7哪个好_win8.1好还是win7好用
  14. 火狐浏览器 for MacFirefox
  15. 陕西2020行政区划调整_陕西行政区划调整畅想:西安咸阳合并可行,但成立直辖市不太现实...
  16. java 读取文件 效率_JAVA读写文本文件的效率
  17. CentOS6.7 i686上安装JDK7
  18. python指纹识别算法_shazam听歌识曲算法解析+python实现-2 生成指纹
  19. Unity3d优化总结2
  20. beyond compare 4 license 过期解决办法

热门文章

  1. List数据转Map数据并进行分组排序
  2. 用CMake编译lua
  3. Dolibarr可以做什么
  4. Struts,Spring,Hibernate面试题总结
  5. 流处理框架Storm简介
  6. python 计算流形上两点之间的测地距离
  7. 数据科学20个最好的Python库
  8. 大白话5分钟带你走进人工智能-第二十四节决策树系列之分裂流程和Gini系数评估(3)...
  9. 【题解】Luogu P2147 [SDOI2008]洞穴勘测
  10. MYSQL数据库表操作pdf