代理模式(Proxy Pattern)

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/411 访问。

代理模式属于结构型模式,为其他对象提供一种代理以控制对这个对象的访问。

在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

角色:

1、抽象主题(Subject)

通过接口或抽象类声明真实角色实现的业务方法;

2、代理主题(Proxy)

真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作;

3、真实主题(Real Subject)

定义真实角色所要实现的业务逻辑,供代理角色调用。

示例:

命名空间ProxyPattern中包含Employee员工类充当抽象主题,Leader领导类充当代理主题,Staff普通员工类充当真实主题。本案例尝试通过员工采购一批桌子来介绍领导是如何通过使用普通员工作为自己的代理为公司采购商品的。

namespace ProxyPattern
public abstract class Employee {

	public abstract void Purchase(string goods);

	protected virtual void OnPurchasing() {
Console.WriteLine("Employee.OnPurchasing()");
} protected virtual void OnPurchased() {
Console.WriteLine("Employee.OnPurchased()");
} }

员工类Employee。

public class Staff : Employee {

	public override void Purchase(string goods) {
OnPurchasing();
Console.WriteLine($"Purchase some {goods}s!");
OnPurchased();
} protected override void OnPurchasing() {
Console.WriteLine("Staff.OnPurchasing()");
} protected override void OnPurchased() {
Console.WriteLine("Staff.OnPurchasing()");
} }

普通员工类Staff。

public class Leader : Employee {

	private Staff _staff = null;

	public Leader() {
_staff = new Staff();
} public override void Purchase(string goods) {
_staff.Purchase(goods);
} }

领导类Leader,内部维持一个员工的引用,并在Purchase采购方法调用普通员工的采购方法。完成了一次代理购物。

public class Program {

	private static Employee _employee = null;

	public static void Main(string[] args) {
_employee = new Leader();
_employee.Purchase("desk"); Console.ReadKey();
} }

以上是调用方的代码,以下是这个案例的输出结果:

Staff.OnPurchasing()
Purchase some desks!
Staff.OnPurchasing()

优点:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/411 访问。

1、代理模式能够将调用用于真正被调用的对象隔离,在一定程度上降低了系统的耦合度;

2、代理对象在客户端和目标对象之间起到一个中介的作用,这样可以起到对目标对象的保护;

3、代理对象可以在对目标对象发出请求之前进行一个额外的操作,例如权限检查等。

缺点:

1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢;

2、实现代理模式需要额外的工作,从而增加了系统的实现复杂度。

使用场景:

1、当客户端对象需要访问远程主机中的对象时可以使用远程代理;

2、当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理,例如一个对象需要很长时间才能完成加载时;

3、当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理。通过使用缓冲代理,系统无须在客户端每一次访问时都重新执行操作,只需直接从临时缓冲区获取操作结果即可;

4、当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理;

5、当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理。

C#设计模式之12-代理模式的更多相关文章

  1. java设计模式之Proxy(代理模式)

    java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...

  2. Java设计模式之《代理模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...

  3. Java设计模式:Proxy(代理)模式

    概念定义 代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 使用代理模式的原因有: 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象, ...

  4. 简介Python设计模式中的代理模式与模板方法模式编程

    简介Python设计模式中的代理模式与模板方法模式编程 这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下 代理模式 Prox ...

  5. 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  6. [设计模式] 12 代理模式 proxy

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对代理模式是这样说的:为其他对象提供一种代理以控制对这个对象的访问.结合上面的游戏代理的例子和下面的图,我们来进行分析一下.以前你是这 ...

  7. C#设计模式学习笔记:(12)代理模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7814004.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第七个模式,也是 ...

  8. 12.代理模式(Proxy Pattern)

    直接与间接:   人们对复杂的软件系统常有一种处理手法,即增加一层间接层,从而对系统获得一种更为灵活.满足特定需求的解决方案.                                      ...

  9. Java设计模式—Proxy动态代理模式

    代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 图 1. 代 ...

  10. 大话设计模式C++版——代理模式

    本篇开始前先发个福利,程杰的<大话设计模式>一书高清电子版(带目录)已上传至CSDN,免积分下载. 下载地址:http://download.csdn.net/detail/gufeng9 ...

随机推荐

  1. 拦截器(Interceptor)中的invocation.invoke()是什么意思?

    拦截器(Interceptor)中的invocation.invoke()是什么意思? 最佳答案: invocation.invoke() 就是通知struts2接着干下面的事情 比如 调用下一个拦截 ...

  2. react实战 : react 与 svg

    有一个需求是这样的. 一个组件里若干个区块.区块数量不定. 区块里面是一个波浪效果组件,而这个一般用 SVG 做. 所以就变成了在 react 中使用 SVG 的问题. 首先是波浪效果需要的样式. . ...

  3. 最小生成树的java实现

    文章目录 一.概念 二.算法 2.1 Prim算法 2.2 Kruskal算法 笔记来源:中国大学MOOC王道考研 一.概念 连通图:图中任意两点都是连通的,那么图被称作连通图 生成树:连通图包含全部 ...

  4. k_means算法+python实现

    文章目录 一.原理 二.算法步骤 三.实例如下: 四.python代码实现: 一.原理 K均值算法使用的聚类准则函数是误差平方和准则,通过反复迭代优化聚类结果,使所有样本到各自所属类别的中心的距离平方 ...

  5. 【Nginx】使用Nginx如何解决跨域问题?看完这篇原来很简单!!

    写在前面 当今互联网行业,大部分Web项目基本都是采用的前后端分离模式.前端为H5项目,后端为Java.PHP.Python等项目.而且大部分后端服务并不会只部署一套服务,而是会采用Nginx对后端服 ...

  6. Selenium自动化:有代码测试与无代码测试。这些你都懂了吗?

    大多数测试人员认为 Selenium是满足其测试自动化需求的自动化框架.作为全球测试人员使用的开放源框架, Selenium 无疑是测试人员适应日趋敏捷的公司的一种好方法.实际上, Selenium仍 ...

  7. maven项目打包到本地库 两种方式

    方式一 1.项目根路径下 maven clean package 或者 maven package ,根据是否需要跳过代码中的测试代码 加上 -DskipTests 2.mvn install:ins ...

  8. 2.pandas的数据结构

    对于文件来说,读取只是最初级的要求,那我们要对文件进行数据分析,首先就应该要知道,pandas会将我们熟悉的文件转换成了什么形式的数据结构,以便于后续的操作 数据结构 pandas对文件一共有两种数据 ...

  9. python(xlsxwriter模块使用)

    XlsxWriter简介XlsxWriter是一个Python模块,可用于在Excel 2007+ XLSX文件中写入多个工作表的文本,数字,公式和超链接.它支持格式化等功能.可到官网了解更多详情,官 ...

  10. oracle SCN推进恢复数据库 简单记录

    由于是在内网专用机器上操作,没有日志记录,下面做个简单记录:   前几天某供电局的的一个老数据库存储挂了,数据全部丢失,该库没有开归档,没接备份,怎么恢复? 由于存储损坏严重,从存储恢复不好搞. 好在 ...