代理模式(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. 使用Python来写mock代码(桩代码)-其实很简单

    1.Mock基本用法 使用Mock能创建你能访问(模拟)的属性和方法 指定类或者函数的返回值和断言方式 创建handle_mock_01.py文件 # 1. 导入mock模块 from unittes ...

  2. 机器学习作业---K-Means算法

    --------------------------K-Means算法使用-------------------------- 一:数据导入及可视化 import numpy as np import ...

  3. OpenXml demo

    class OpenXmlDemo { /* * excel 对象结构 * SpreadsheetDocument * >WorkbookPart * >WorksheetPart * & ...

  4. CSS3选择器用法小结

    1.*通配符选择器 eg:*{margin:0;padding:0;} 2.#id选择符 ID选择器是CSS中效率最高的选择器,使用的时候要保证ID的唯一性 eg:#div{width:960px;m ...

  5. Centos7安装Docker1.9.1

    1.先检查是否安装旧版本docker [root@registry ~]# rpm -qa|grep docker 我这里没有安装,如果安装,请rpm -e 卸载2.编辑docker.repo文件,写 ...

  6. 常见的HTTP返回状态值

    200 (成功) 服务器已成功处理了请求. 通常,这表示服务器提供了请求的网页. 301 (永久移动) 请求的网页已永久移动到新位置. 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自 ...

  7. html标签集合

    ---恢复内容开始--- 基础 <!DOCTYPE>,<html>,<title>,<body>,<h1>to<h6>,< ...

  8. jupyter的服务器配置安装

    该教程主要针对的是服务器安装,且在后台保持稳定运行的情况. 1.jupyter下载 有网的时候 1. pip install jupyter 离线安装 在有网络的环境下载安装包 2. pip down ...

  9. Django学习路21_views函数中定义字典及html中使用类实例对象的属性及方法

    创建 app6 在项目的 settings 中进行注册 INSTALLED_APPS 里面添加 'app6.apps.App6Config' 在 app6 的models.py 中创建数据表 clas ...

  10. win10在html上运行java的applet程序

    Applet是采用Java编程语言编写的小应用程序,该程序可以包含在 HTML(标准通用标记语言的一个应用)页中,与在页中包含图像的方式大致相同. 含有Applet的网页的HTML文件代码中部带有 和 ...