大话设计模式:代理模式 C#
学无止境,精益求精
十年河东,十年河西,莫欺少年穷
学历代表你的过去,能力代表你的现在,学习代表你的将来
所谓代理模式就是你去委托一个人帮你干一件事!例如:你委托我帮你谈恋爱,你委托我帮你陪你媳妇儿逛街,你委托我帮你陪你女朋友回家过年!等等吧!这些事情有需求,请找我,电话:XXX,微信:XXX,QQ:XXX...
首先看看代理模式的 UML 类图:
上图中:RealSubject 代表的是你,Proxy 代表的是我,Subject 是你委托我做的一些事情。就拿你委托我陪你媳妇儿逛街来说,你告诉我要帮你媳妇儿买裙子,买鞋子,买零食等等,这些事情可以看成上图的抽象类 Sbuject 中的抽象方法。而我作为你的代理,我可以把你给我交代给我的事情不完全做,也就是说我可以不给你媳妇儿买零食。当然,我也可以偷偷背着你给你媳妇买玫瑰花。总之,作为代理的我可以全做,也可以部分做,亦可以偷偷趁机多做一点,给你媳妇儿献殷勤,说不定将来的某一天你媳妇儿就归我了!哈哈哈 ~_~
呵呵,调皮了点,言归正传!
那么咱们来看看C#实现代码模式的基础代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace ConsoleApplication1
{
/// <summary>
/// 抽象接口类
/// </summary>
abstract class Subject
{
public abstract void Request();
}
/// <summary>
/// 真是实体类
/// </summary>
class RealSubject: Subject
{
public override void Request()
{
Console.WriteLine("真实的请求");
}
}
/// <summary>
/// 代理类
/// </summary>
class Proxy: Subject
{
RealSubject realSubject;
public override void Request()
{
if (realSubject==null)
{
realSubject= new RealSubject();
}
realSubject.Request();
}
}
/// <summary>
/// 客户端代码
/// </summary>
class Program
{
public static void Main(string[] args)
{
Proxy proxy= new Proxy();
proxy.Request(); Console.Read();
}
}
}
在此,为了让大家更深刻的了解代理模式,鄙人引用下别人的叙述,如下:
说起代理模式的时候,我顺便给大家说说我十一假期干嘛去了,但愿不会被打死(你们这是嫉妒我)
十一的时候呢,跟着我女朋友去她家了,从北京坐了十个小时的高铁到了广州,然后又辗转半天才到女朋友家,一开门我就把准备了好几天的话一口气对着她妈说完了,只见我这未来岳母一脸懵逼的看着我,然后来了句"!@#$%^&&*%",卧槽,这下轮到我懵逼了,此时只听我女朋友淡淡的来了一句"我妈不会说普通话,只会说粤语",MDZZ,你早说啊,害我提前准备了两天的说辞全白费了,然后在那呆了四五天,基本的套路就是我跟她爸妈的交流都是她爸妈先问,然后她翻译成普通话,然后我回答,她再添油加醋的翻译成粤语,好蛋疼。
针对以上情况,这不刚好是代理模式吗?
上述叙述博客原文:https://www.cnblogs.com/liaidai/p/5956883.html
下面看看使用代码怎么实现上述的情景:
首先委托者和被委托者要有一个公共的交流类(意思就是说,被委托者需要帮委托者做什么的类)
/// <summary>
/// UML 类图中的 Subject
/// </summary>
public abstract class Communication
{ public abstract void talkHome();//谈家庭 public abstract void talkWork();//谈工作 public abstract void talkMarry();//谈结婚 public abstract void talkOther();//谈其他 }
其次,无论是委托者我还是被委托者我的女盆友都必须继承这个类:
/// <summary>
/// 我,被代理的人
/// </summary>
public class Me : Communication
{
public override void talkHome()
{
Console.WriteLine("我说我的家庭");
} public override void talkWork()
{
Console.WriteLine("我说我的工作");
} public override void talkMarry()
{
Console.WriteLine("我说结婚");
} public override void talkOther()
{
Console.WriteLine("我说其他");
} } /// <summary>
/// 我的女盆友,也是我的代理人
/// </summary>
public class MyGirlFriend : Communication
{
private Me me; public MyGirlFriend()
{
if (me == null)
{
this.me = new Me();
}
} public override void talkHome()
{
me.talkHome();
Console.WriteLine("GF翻译加工我的家庭");
} public override void talkWork()
{
me.talkWork();
Console.WriteLine("GF翻译加工我的工作");
} public override void talkMarry()
{
me.talkMarry();
Console.WriteLine("GF翻译加工关于结婚");
} public override void talkOther()
{
me.talkOther();
Console.WriteLine("GF翻译加工关于其他");
}
}
static void Main(string[] args)
{
MyGirlFriend GF = new MyGirlFriend();
GF.talkHome();
GF.talkMarry();
GF.talkOther();
GF.talkWork();
//
Console.ReadKey();
}
最后,我们看看程序的最后执行如下:
OK,其实代理模式的UML类图很简单,实现起来亦是很简单。
但是,我们学习设计模式,最重要的并不是会编写UML类图展现的代码,而应该学会该设计模式的应用场景!
那么,代理模式的应用场景是什么呢?
代理模式效果与适用场景
代理模式是常用的结构型设计模式之一,它为对象的间接访问提供了一个解决方案,可以对对象的访问进行控制。代理模式类型较多,其中远程代理、虚拟代理、保护代理等在软件开发中应用非常广泛。
模式优点
代理模式的共同优点如下:
(1) 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。
(2) 客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性。
此外,不同类型的代理模式也具有独特的优点,例如:
(1) 远程代理为位于两个不同地址空间对象的访问提供了一种实现机制,可以将一些消耗资源较多的对象和操作移至性能更好的计算机上,提高系统的整体运行效率。
(2) 虚拟代理通过一个消耗资源较少的对象来代表一个消耗资源较多的对象,可以在一定程度上节省系统的运行开销。
(3) 缓冲代理为某一个操作的结果提供临时的缓存存储空间,以便在后续使用中能够共享这些结果,优化系统性能,缩短执行时间。
(4) 保护代理可以控制对一个对象的访问权限,为不同用户提供不同级别的使用权限。
模式缺点
代理模式的主要缺点如下:
(1) 由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢,例如保护代理。
(2) 实现代理模式需要额外的工作,而且有些代理模式的实现过程较为复杂,例如远程代理。
模式适用场景
代理模式的类型较多,不同类型的代理模式有不同的优缺点,它们应用于不同的场合:
(1) 当客户端对象需要访问远程主机中的对象时可以使用远程代理。
(2) 当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理,例如一个对象需要很长时间才能完成加载时。
(3) 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理。通过使用缓冲代理,系统无须在客户端每一次访问时都重新执行操作,只需直接从临时缓冲区获取操作结果即可。
(4) 当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理。
(5) 当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理。
关于代理模式更加深入的剖析,大家可参考以下博客:
代理模式剖析:http://jiangshuiy.iteye.com/blog/1333558
代理模式剖析:https://www.cnblogs.com/zoupeiyang/archive/2009/05/26/1489333.html
OK,截止到这儿,代理模式也就在幽默中讲完了!
@陈卧龙的博客
大话设计模式:代理模式 C#的更多相关文章
- linkin大话设计模式--代理模式
代理模式是一种应用非常广泛的设计模式,当客户端代码需要调用某个对象的时候,客户端并不关心是否可以准确的得到这个对象,他只要一个能够提供该功能的对象而已,此时我们就可以返回该对象的代理.总而言之,客户端 ...
- 大话设计模式--代理模式 proxy
1. 代理模式: 为其他对象提供一种代理以控制这个对象的访问. 代理模式使用场合: a. 远程代理, 为一个对象在不同的地址空间提供局部代理,隐藏一个对象存在于不同地址空间的事实.如.net中WebS ...
- linkin大话设计模式--常用模式总结
linkin大话设计模式--常用模式总结 一,常用设计模式定义 Abstract Factory(抽象工厂模式):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. Adapter( ...
- 9. 星际争霸之php设计模式--代理模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- C++设计模式——代理模式
前言 青春总是那样,逝去了才开始回味:大学生活也是在不经意间就溜走了,现在上班的时候,偶尔还会怀念大学时,大家在一起玩游戏的时光.大学喜欢玩游戏,但是可悲的校园网,速度能把人逼疯了:还好,后来搞了一个 ...
- linkin大话设计模式--建造模式
linkin大话设计模式--建造模式 建造模式是对象的创建模式,可以讲一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象. 建造模式的结构: 抽象建造者 ...
- linkin大话设计模式--模板方法模式
linkin大话设计模式--模板方法模式 准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不 ...
- linkin大话设计模式--桥接模式
linkin大话设计模式--桥接模式 桥接模式是一种结构化模式,他主要应对的是:由于实际的需要,某个类具有2个或者2个以上维度的变化,如果只是使用继承将无法实现功能,或者会使得设计变得相当的臃肿.我们 ...
- linkin大话设计模式--门面模式
linkin大话设计模式--门面模式 随着系统的不断改进和开发,他们会变得越来越复杂,系统会生成大量的类,这使得程序的流程更加难以理解.门面模式可以为这些类提供一个简易的接口,从而简化访问这些类的复杂 ...
- linkin大话设计模式--策略模式
linkin大话设计模式--策略模式 Strategy [ˈstrætədʒi] 策略 策略模式用于封装系列的算法,这些算法通常被封装在一个称为Context的类中,客户端程序可以自由的选择任何一种 ...
随机推荐
- JMeter 扩展JMeter插件获取更多监听器
扩展Jmeter插件获取更多监听器 by:授客 QQ:1033553122 为了获取更多监听器,方便的监控系统及应用,有必要安装第三方插件. 插件下载地址: https://jmeter-plugin ...
- loadrunner 脚本开发-int型变量和字符串的相互转换
脚本开发-int型变量和字符串的相互转换 by:授客 QQ:1033553122 字符串转化为int型变量 Action2() { int j = 0; j = atoi("12345&qu ...
- .Net Core(三)MVC Core
MVC Core的改动感觉挺大的,需要的功能大多从Nuget安装,还内置了IOC,支持SelfHost方式运行等等. 一.项目结构的变化创建的新MVC项目的结构发生了变化,比如:静态文件需要统一放置到 ...
- 记录修改安卓5.0系统浏览器UI遇到的部分问题
碎碎念 今年七月份本科毕业后入职一家会议平板公司,经过一个一个多月的咸鱼培训轮岗生活,接手了几个小任务,本次记录一下其中一个任务:修改安卓5.0系统浏览器UI.刚接到任务的时候,本以为是很简单的一个任 ...
- JS笔记(一):基础知识
(一) 标识符 标识符就是一个名字,在JS中,标识符用来对变量和函数命名,或者用做JS代码中某些循环语句中的跳转位置的标记.JS的标识符必须以字母._或$符号开始,后续字符可以是字母.数字._或$符号 ...
- IP Core 分类
IP(Intelligent Property)核是具有知识产权核的集成电路芯核总称,是经过反复验证过的.具有特定功能的宏模块,与芯片制造工艺无关,可以移植到不同的半导体工艺中.到了SOC阶段,IP核 ...
- nginx+gunicorn项目部署
1.1安装虚拟环境 创建文件夹 mkdir data 目录文件夹 cd data 进入data文件夹 mkdir nginx 创建安装nginx的文件夹 mkdir server 存放代码的文件夹 m ...
- LInux下(centos7.2)更新 python3.7
进入超级管理员目录 su root 下载 wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz 找到下载的文件解压 tar - ...
- gcc库链接
转载于https://blog.csdn.net/zhangdaisylove/article/details/45721667 1.库的分类 库有静态库和动态库,linux下静态库为.a,动态库为. ...
- 17秋 软件工程 第六次作业 Beta冲刺 Scrum2
17秋 软件工程 第六次作业 Beta冲刺 Scrum2 我们组转会成员:杰麟: 我们组新成员:宏庆. 各个成员冲刺期间完成的任务 世强:完成分页功能的演示: 陈翔:完成超级管理员后端login模块: ...