C#设计模式之12-代理模式
代理模式(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-代理模式的更多相关文章
- java设计模式之Proxy(代理模式)
java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...
- Java设计模式之《代理模式》及应用场景
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6525527.html 代理模式算是我接触较早的模式,代理就是中介,中间人.法律上也有代理, ...
- Java设计模式:Proxy(代理)模式
概念定义 代理模式是一种使用代理对象来执行目标对象的方法并在代理对象中增强目标对象方法的一种设计模式. 使用代理模式的原因有: 中介隔离作用:在某些情况下,一个客户类不想或者不能直接引用一个委托对象, ...
- 简介Python设计模式中的代理模式与模板方法模式编程
简介Python设计模式中的代理模式与模板方法模式编程 这篇文章主要介绍了Python设计模式中的代理模式与模板方法模式编程,文中举了两个简单的代码片段来说明,需要的朋友可以参考下 代理模式 Prox ...
- 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- [设计模式] 12 代理模式 proxy
在GOF的<设计模式:可复用面向对象软件的基础>一书中对代理模式是这样说的:为其他对象提供一种代理以控制对这个对象的访问.结合上面的游戏代理的例子和下面的图,我们来进行分析一下.以前你是这 ...
- C#设计模式学习笔记:(12)代理模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7814004.html,记录一下学习过程以备后续查用. 一.引言 今天我们要讲结构型设计模式的第七个模式,也是 ...
- 12.代理模式(Proxy Pattern)
直接与间接: 人们对复杂的软件系统常有一种处理手法,即增加一层间接层,从而对系统获得一种更为灵活.满足特定需求的解决方案. ...
- Java设计模式—Proxy动态代理模式
代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 图 1. 代 ...
- 大话设计模式C++版——代理模式
本篇开始前先发个福利,程杰的<大话设计模式>一书高清电子版(带目录)已上传至CSDN,免积分下载. 下载地址:http://download.csdn.net/detail/gufeng9 ...
随机推荐
- OSCP Learning Notes - Buffer Overflows(2)
Finding the Offset 1. Use the Metasploite pattern_create.rb tool to create 5900 characters. /usr/sha ...
- vs coed的使用(二) 如何运行cpp文件(不用插件比如code runner)
一.前提 1.配置好编译运行的环境,比如系统变量.vs code的settings.json 2.检查配置好的环境没有问题 我配置结果 [环境变量] [系统变量] 确定settings.json里面的 ...
- vue-methods三种调用的形势
var btn = { template:`<button>组件add</button>` } var any = new Vue({ el: '#app', data:{ a ...
- Echarts柱状图顶部加数量显示
//加在series中itemStyle: { normal: { label: { show: true, position: 'top', textStyle: { color: '#615a5a ...
- vue的自定义指令。directive
在vue中有很多vue自带的指令,比如v-heml.v-for.v-if,v-on.v-bind.v-else.v-show. 但是这些指令还不够我们使用的.就有了directive这个对象. 这个使 ...
- java大数据最全课程学习笔记(6)--MapReduce精通(二)--MapReduce框架原理
目前CSDN,博客园,简书同步发表中,更多精彩欢迎访问我的gitee pages 目录 MapReduce精通(二) MapReduce框架原理 MapReduce工作流程 InputFormat数据 ...
- 【Laravel 】faker数据填充详解
安装 在laravel中已经自动集成,无需手动安装.如需在其他地方使用,可使用以下命令进行安装. composer require fzaninotto/faker 为Faker指定中文支持 可通过在 ...
- LQB201808全球变暖 bfs
#include<iostream> #include<stdio.h> #include<stdlib.h> #include<time.h> #in ...
- Springboot 多数据源配置,结合tk-mybatis
一.前言 作为一个资深的CRUD工程师,我们在实际使用springboot开发项目的时候,难免会遇到同时使用多个数据库的情况,比如前脚刚查询mysql,后脚就要查询sqlserver. 这时,我们很直 ...
- Django 项目分析后得到的某些结论
项目下的 urls 篇 urlpatterns = [ ] 其中主要是包含有各个 app 的路由 示例: url(r'^users/', include('users.urls', namespace ...