三十三

首页新闻博问专区闪存班级我的博客我的园子账号设置退出登录注册登录

Tynam Yang 首页新随笔联系管理随笔 - 322  文章 - 6  评论 - 119 C#设计模式——代理模式(Proxy Pattern) 引言在我们的生活中,经常会遇到需要什么东西,但是自己又不是很方便或者对方不是很方便,则就需要中间的一个代理人去解决。例如代购。
在软件开发中,也会遇到这样的问题。有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象,然后客户端只需要访问代理对象,由代理对象去帮我们去请求目标对象并返回结果给客户端,这样的一个解决思路就是今天要介绍的代理模式。概念代理是一种结构型设计模式, 让你能提供真实服务对象的替代品给客户端使用。 代理接收客户端的请求并进行一些处理 (访问控制和缓存等), 然后再将请求传递给服务对象。
代理对象拥有和服务对象相同的接口, 这使得当其被传递给客户端时可与真实对象互换。结构图代理模式所涉及的角色有三个:抽象主题角色(Person):声明了真实主题和代理主题的公共接口,这样一来在使用真实主题的任何地方都可以使用代理主题。代理主题角色(Friend):代理主题角色内部含有对真实主题的引用,从而可以操作真实主题对象;代理主题角色负责在需要的时候创建真实主题对象;代理角色通常在将客户端调用传递到真实主题之前或之后,都要执行一些其他的操作,而不是单纯地将调用传递给真实主题对象。例如这里的PreBuyProduct和PostBuyProduct方法就是代理主题角色所执行的其他操作。真实主题角色(RealBuyPerson):定义了代理角色所代表的真是对象。分类 代理模式按照使用目的可以分为以下几种:远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象。这个不同的地址空间可以是本电脑中,也可以在另一台电脑中。最典型的例子就是——客户端调用Web服务或WCF服务。虚拟(Virtual)代理:根据需要创建一个资源消耗较大的对象,使得对象只在需要时才会被真正创建。Copy-on-Write代理:虚拟代理的一种,把复制(或者叫克隆)拖延到只有在客户端需要时,才真正采取行动。保护(Protect or Access)代理:控制一个对象的访问,可以给不同的用户提供不同级别的使用权限。防火墙(Firewall)代理:保护目标不让恶意用户接近。智能引用(Smart Reference)代理:当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等。Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以这些结果。 在上面所有种类的代理模式中,虚拟代理、远程代理、智能引用代理和保护代理较为常见的代理模式。实现例如项目A的PM需要购买一个测试工具,但是测试工具的运营商在国外,自己过去不是很方便,所以需要找一个代理商帮助自己去购买。下面就实现此购买的例子:using System;

namespace Proxy
{
class Program
{
static void Main(string[] args)
{

        ProgramManagement PM = new ProgramManagement();
        PM.BuyToolName = "Bug管理工具";
        PM.BuyTestTool();

        ProxyBuyTestTool Tynam = new ProxyBuyTestTool(PM);
        Tynam.BuyTestTool();


        Console.ReadKey();
    }
}

public interface ITestTool
{
    void BuyTestTool();
}

public class ProgramManagement : ITestTool
{

    public string BuyToolName;
    public void BuyTestTool()
    {
        Console.WriteLine($"项目A需要找一个代理商购买国外的一款{this.BuyToolName}的测试工具");
    }
}

public class ProxyBuyTestTool : ITestTool
{
    private ProgramManagement _pm;

    public ProxyBuyTestTool(ProgramManagement pm)
    {
        this._pm = pm;
    }

    public void BuyTestTool()
    {
        Console.WriteLine($"帮助项目A购买测试工具{this._pm.BuyToolName}成功");
    }

}

}运行后结果项目A需要找一个代理商购买国外的一款Bug管理工具的测试工具
帮助项目A购买测试工具Bug管理工具成功使用场景当无法或不想直接引用某个对象或访问某个对象存在困难时,可以通过代理对象来间接访问。使用代理模式主要有两个目的:一是保护目标对象,二是增强目标对象。由于代理模式有许多分类,应用场景又适于多种情况:远程代理,这种方式通常是为了隐藏目标对象存在于不同地址空间的事实,方便客户端访问。例如,用户申请某些网盘空间时,会在用户的文件系统中建立一个虚拟的硬盘,用户访问虚拟硬盘时实际访问的是网盘空间。虚拟代理,这种方式通常用于要创建的目标对象开销很大时。例如,下载一幅很大的图像需要很长时间,因某种计算比较复杂而短时间无法完成,这时可以先用小比例的虚拟代理替换真实的对象,消除用户对服务器慢的感觉。安全代理,这种方式通常用于控制不同种类客户对真实对象的访问权限。智能指引,主要用于调用目标对象时,代理附加一些额外的处理功能。例如,增加计算真实对象的引用次数的功能,这样当该对象没有被引用时,就可以自动释放它。延迟加载,指为了提高系统的性能,延迟对目标的加载。例如,Hibernate 中就存在属性的延迟加载和关联表的延时加载。优缺点优点:代理模式在客户端与目标对象之间起到一个中介作用和保护目标对象的作用。代理对象可以扩展目标对象的功能。代理模式能将客户端与目标对象分离,在一定程度上降低了系统的耦合度,增加了程序的可扩展性。缺点:代理模式会造成系统设计中类的数量增加。在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢。增加了系统的复杂度。 作者:Tynam.Yang
      出处:https://www.cnblogs.com/tynam/
      本文版权归作者和博客园共有,欢迎转载但需在文章页面明显位置给出作者和原文链接,否则保留追究法律责任的权利。 分类: 设计模式好文要顶 关注我 收藏该文 Tynam.Yang
关注 - 22
粉丝 - 310 +加关注 00

« 上一篇: C#设计模式-原型模式(Prototype Pattern) posted @ 2020-11-23 10:20  Tynam.Yang  阅读(61)  评论(0)  编辑  收藏

刷新评论刷新页面返回顶部

发表评论 【福利】注册AWS账号,立享12个月免费套餐 编辑预览 7693b08a-a8f6-49f3-f45a-08d88556cc23 Markdown 帮助自动补全 不改了退出 订阅评论 [Ctrl+Enter快捷键提交]

首页 新闻 博问 专区 闪存 班级 【推荐】News: 大型组态、工控、仿真、CADGIS 50万行VC++源码免费下载
【推荐】博客园 & 陌上花开HIMMR 给单身的程序员小哥哥助力脱单啦~
【推荐】从零开始的RPG游戏制作教程,来《魔兽争霸III》共同成长
【推荐】了不起的开发者,挡不住的华为,园子里的品牌专区
【推荐】未知数的距离,毫秒间的传递,声网与你实时互动
【福利】AWS携手博客园为开发者送免费套餐与抵扣券
【推荐】 阿里云折扣价格返场,错过再等一年
相关博文:
· 正则表达式--(?:pattern)与(?=pattern)的区别
· ProxyReflect
· charles开启Charles-Proxy-macOSProxy时报错
· Fun论设计模式之2:代理模式(ProxyPattern)与华为云API设计之一
· ES6知识点-Proxy和Reflect
» 更多推荐…最新 IT 新闻:
· 当你按下「随机播放」时,QQ音乐和网易云们都做了什么?
· 「菜鸟」索尼挑战大疆,无人机行业来了新玩家
· 谷歌整合所有音乐服务,YouTube能否扛起大旗?
· vivo为什么要重新做一个手机系统?
· 超大 AirPods、9 倍大纸牌、手机投影仪……这些产品不好用但很吸睛
» 更多新闻…

公告联系我:tynam.yang@gmail.com 昵称: Tynam.Yang
园龄: 2年8个月
粉丝: 310
关注: 22 +加关注

搜索    我的标签appium(3) 设计模式(3) 性能测试(1) book(1) 积分与排名 积分 - 232850 排名 - 2535 随笔分类 (343) appium(9) app测试(7) C#(27) database(8) Django(4) docker(4) Html+CSS(18) JaveScript(14) Jenkins(4) JMeter(28) linux及shell(17) postman(3) python(35) python接口(7) python爬虫(6) selenium(31) Tkinter(20) 安全测试(5) 测试基础(21) 测试面试(12) 测试资料(4) 漫谈测试(9) 模拟器&虚拟机(7) 其他(19) 设计模式(6) 书籍推荐(3) 数据分析(2) 网络协议(6) 性能测试(1) 抓包工具(6) 文章分类 (6) 笔记后感(1) 漫谈杂论(1) 诗词赏析(3) 闲情趣事(1) 常用网站 chrome插件网 在线工具 花瓣网 GitHub stackoverflow 阅读排行榜 1. python对Excel的读取(100978) 2. BurpSuit2.0专业版破解(23158) 3. Visual Studio语言设置(19784) 4. 虚拟机-linux系统中图形界面和命令行界面切换(9352) 5. C#-判断语句(五)(8955) 推荐排行榜 1. python对Excel的读取(55) 2. C#-特性(Attribute)(27) 3. C#-索引器(23) 4. C#设计模式-模板方法模式(Template Method)(11) 5. Newman基本使用(11)

Copyright © 2020 Tynam.Yang
Powered by .NET 5.0.0 on Kubernetes

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值