-
C#设计模式学习笔记:(12)代理模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7814004.html,记录一下学习过程以备后续查用。
一、引言
今天我们要讲结构型设计模式的第七个模式,也是结构型设计模式中的最后一个模式–代理模式。先从名字上来看,“代理”可以理解为“代替”,代替“主人”
做一些事情。为什么需要“代理”?是因为某些原因(比如:安全方面的原因),不想让“主人”直接面对这些繁琐、复杂的问题,但是这些事情是经“主人”同意
或者授意的,如同“主人”亲自完成的一样。这个模式很简单,生活中的例子也很多。举例说明:歌星、影星的经纪人就是现实生活中一个代理模式的很好例
子,还有操作系统中的防火墙,也是代理的例子,要访问系统,先过防火墙这关,否则免谈。还有很多了,就不一一列举了,大家在生活中慢慢地体会吧。
二、代理模式介绍
代理模式:英文名称–Proxy Pattern;分类–结构型。
2.1、动机(Motivate)
在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者
或者系统结构带来很多麻烦。如何在不失去透明操作对象的同时来管理/控制这些对象特有的复杂性?增加一层间接层是软件开发中常见的解决方式。
2.2、意图(Intent)
为其他对象提供一种代理以控制对这个对象的访问。——《设计模式》GoF
2.3、结构图(Structure)
2.4、模式的组成
代理模式所涉及的角色有三个:
1)抽象主题角色(Subject):声明了真实主题和代理主题的公共接口,这样一来在使用真实主题的任何地方都可以使用代理主题。
2)代理主题角色(Proxy):代理主题角色内部含有对真实主题的引用,从而可以操作真实主题对象;代理主题角色负责在需要的时候创建真实主题对象;
代理角色通常在将客户端调用传递到真实主题之前或之后,都要执行一些其他的操作python基础教程
,而不是单纯地将调用传递给真实主题对象。
3)真实主题角色(RealSubject):定义了代理角色所代表的真实对象。
附:在WCF或者WebService的开发过程中,我们在客户端添加服务引用的时候,在客户程序中会添加一些额外的类,在客户端生成的类扮演着代理主题
角色,我们客户端也是直接调用这些代理c#教程角色来访问远程服务提供的操作,这个是远程代理的一个典型例子。
2.5、代理模式的分类
代理模式按照使用目的可以分为以下几种:
1)远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是本电脑中,也可以在另一台电脑中。最
典型的例子就是–客户端调用Web服务或WCF服务。
2)虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得对象只在需要时才会被真正创建。
3)Copy-on-Write代理:虚拟代理的一种,把复制(或者叫克隆)拖延到只有在客户端需要时,才真正采取行动。
4)保护(Protect or Access)代理:控制一个对象的访问,可以给不同的用户提供不同级别的使用权限。
5)防火墙(Firewall)代理:保护目标不让恶意用户接近。
6)智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。
7)Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以这些结果。
在上面所有种类的代理模式中,虚拟代理、远程代理、智能引用代理和保护代理较为常见的代理模式。
2.6、代理模式的具体实现
说起代理模式,其实很容易,现实生活中的例子也很多。明星的经纪人,国家的发言人都是代理的好例子。
下面我们就用明星经纪人这个例子来介绍“代理模式”的实现吧。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 1
- 1
- 2
- 3
- 4
- 5
是解决这一问题的常用手段。具体Proxy设计模式的实现方法、实现粒度都相差很大,有些可能对单个对象做细粒度的控制,如copy-on-write技术,有些可能
对组件模块提供抽象代理层,在架构层次对对象做Proxy。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
作,例如权限检查等。不同类型的代理模式也具有独特的优点,例如:
- 1
体运行效率。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
间才能完成加载时。
- 1
在客户端每一次访问时都重新执行操作,只需直接从临时缓冲区获取操作结果即可。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
程外或者机器外的对象。类级别的有StringBuilder类型,StringBuilder其实就是一种代理,我们本意是想访问字符串的,StringBuilder就是一种可变字符串的代
理,而且StringBuilder也没有和String保持接口的一致性。
- 1
- 2
- 3
的设计模式,所谓结构型设计模式模式,顾名思义讨论的是类和对象的结构,主要用来处理类或对象的组合。它包括两种类型:一是类结构型模式,指的是采用
继承机制来组合接口或实现;二是对象结构型模式,指的是通过组合对象的方式来实现新的功能。它包括适配器模式、桥接模式、装饰者模式、组合模式、外观
模式、享元模式和代理模式。设计模式到现在也说了不少了,但是看起来很多模式都很类似,之间好像很容转换,有时候条件不同了,的确模式也可以转换,但
是不能肆意的转换。为了避免思想的混乱,我们把“结构型”这个几个设计模式,再总结一次,把握核心,理解使用场景。
适配器模式注重转换接口,将不吻合的接口适配对接。
桥接模式注重分离接口与其实现,支持多维度变化。
组合模式注重统一接口,将“一对多”的关系转化为“一对一”的关系
装饰者模式注重稳定接口,在此前提下为对象扩展功能。
外观模式注重简化接口,简化组件系统与外部客户程序的依赖关系。
享元模式注重保留接口,在内部使用共享技术对对象存储进行优化。
代理模式注重假借接口,增加间接层来实现灵活控制。
从下篇文章就开始写“行为型”设计模式,今天就到此结束了。