c#设计模式之代理模式(Proxy Pattern)
引言
代理这个词语,大家在现实世界已经频繁的接触过,例如火车站代理售票点,因为这些代理售票点的存在,我们不必要去火车站的售票处就可以查询或者取到火车票.代理点本身是没有能力生产车票的,我们在代理处享受到的其实就是火车站售票处的服务,同时我们还能够在代理点享受到火车站售票处没有的服务,例如代理点有个自动售货机,我们还能够享受到购物的服务.这就是代理的优势所在
在设计模式中也有那么一种模式,与代理这个定义紧密相连,下面我将以最简洁的代码展示它
- /// <summary>
- /// 业务抽象
- /// </summary>
- public interface ISubject
- {
- void GetTicket();
- }
业务抽象
- /// <summary>
- /// 真正的逻辑对象
- /// </summary>
- public class RealSubject : ISubject
- {
- public void GetTicket()
- {
- Console.WriteLine(".....取票动作.....");
- }
- }
真实业务
- /// <summary>
- /// 真正业务对象的代理
- /// </summary>
- class ProxySubject:ISubject
- {
- private static ISubject _subject = null;
- void ProxySubject_Init()
- {
- if (_subject == null)
- {
- _subject = new RealSubject();
- }
- }
- public void GetTicket()
- {
- if (_subject == null)
- {
- ProxySubject_Init();
- }
- //AOP:日志,缓存,权限,延迟,异常
- _subject.GetTicket();
- }
- }
代理业务
- class Program
- {
- static void Main(string[] args)
- {
- var proxy = new ProxySubject();
- proxy.GetTicket();
- Console.ReadKey();
- }
- }
打印
观察上述代码我们发现它有以下特点
1上端调用的不是真实的业务对象,而是它的一个代理,真实的业务逻辑被隔离
2在代理之内,我们还能额外的定义其他的逻辑,而不影响真实的业务逻辑
这就是一个代理模式
当我们不想或不能直接调用一个业务逻辑对象,我们可以在它之上添加一个代理, 用来屏蔽具体的业务逻辑或者增加额外的业务
代理模式
因为代理本身就是一个比较简洁的思想,所以代理模式的类图也比较简单,如下:
代理模式中有三种角色:
主题的抽象角色(ISubject):真实主题和代理主题的抽象
真实的主题角色(RealSubject):真实主题,提供最根本的业务逻辑
主题的代理角色(ProxySubject):真实主题的代理,能够引用真实主题,同时添加一些额外的功能
注意:提供业务逻辑的是真实主题,而不是代理,代理只是起到引用的作用,同时可以增加一些额外的功能
相交装饰器模式
在设计模式里面,有一种设计模式叫做装饰器模式,它能够动态的为对象添加功能,
如果对这两种模式都有所了解的话,会发现他们其实有很多共同之处,同样都是具体对象与辅助对象依赖抽象的方式
例如,我们想为对象添加一个日志的功能:我们既可以选择为它添加一个代理来实现,也可以选择添加一个装饰器来实现,这个时候我们可能会迷惑,添加的到底是代理还是装饰器
对于它们的区别,从他们出发的场景来比较是最好的,从出发场景来看,装饰器模式注重的是对原有对象功能的扩展,而代理模式注重的是对原有对象的控制或屏蔽,个人觉得这是他们最大的区别
适用场景
当我们不想或不能直接调用一个业务逻辑对象,我们可以在它之上添加一个代理, 用来屏蔽具体的业务逻辑或者增加额外的业务
优点:
1降低了系统的耦合度,这是设计模式比较共通的优点;
2能够屏蔽真实的业务逻辑,同时还能额外增加功能
缺点
使用了代理模式,需要增加代理类,必然会增加系统的复杂程度
出自:博客园-半路独行
原文地址:https://www.cnblogs.com/banluduxing/p/9267705.html
本文出自于http://www.cnblogs.com/banluduxing 转载请注明出处。
c#设计模式之代理模式(Proxy Pattern)的更多相关文章
- 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)
原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...
- 二十四种设计模式:代理模式(Proxy Pattern)
代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...
- 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)【转】
介绍 为其他对象提供一个代理以控制对这个对象的访问. 示例 有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对象的访问. MessageModel ...
- 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 设计模式 - 代理模式(proxy pattern) 未使用代理模式 具体解释
代理模式(proxy pattern) 未使用代理模式 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 部分代码參考: http://blog.csdn. ...
- 代理模式(Proxy pattern)
代理模式(proxy pattern):作用:为其他对象提供一种代理,以控制对这个对象的访问.代理对象在客户端对象和目标对象之间起中介的作用. 代理模式涉及到的角色: 抽象角色:声明真实对象和代理对象 ...
- 设计模式——代理模式(Proxy Pattern)
代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...
- 13.代理模式(Proxy Pattern)
using System; namespace Test { //抽象角色:声明真实对象和代理对象的共同接口. //代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象, //同时代理 ...
- 大熊君说说JS与设计模式之------代理模式Proxy
一,总体概要 1,笔者浅谈 当我们浏览网页时,网页中的图片有时不会立即展示出来,这就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸,这就是代理方式的一种. 代理模式是比较有用途的一 ...
随机推荐
- 常见报表的JS代码
1.合并单元格 这个表格在报表里面算是比较典型的 1.里面的表格的列标题现在是写死的,其实这些可以通过配置进行 2.至于如果表头要进行合并(这种需求比较少,也比较容易实现) 3.至于统计:最好在后台按 ...
- 使用css弹性盒子模型
提示: 当期内容不充实, 修改后再来看吧 以下称:弹性子元素: 子元素, 弹性容器: 容器 弹性盒子的属性 1. css弹性盒子模型规定了弹性元素如何在弹性容器内展示 2. 弹性元素默认显示在弹性容器 ...
- 43.国际化-app级别的资源文件
转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 在src目录下建立两个资源文件,取名为myapp_en_US.propert ...
- 获取当前函数名 __FUNCTION__ 的使用<转>
vs项目中见过这种获取 当前函数名的调用.觉得挺方便的就记录一下. ============================================================== 转载地 ...
- 小学生轻松做题App
作业链接:https://edu.cnblogs.com/campus/fzzcxy/2016SE/homework/2180 原型模型设计工具:墨刀 原型模型链接:https://modao.cc/ ...
- python 把txt文件分隔成0.8和0.2的比例的新文件
from math import sqrt import randomimport osfrom sklearn import cross_validation os.chdir("/*&q ...
- lda spark 代码官方文档
http://spark.apache.org/docs/1.6.1/mllib-clustering.html#latent-dirichlet-allocation-lda http://spar ...
- archiver error. Connect internal only, until freed. 之解决办法
这个报错说的是数据库的日志备份不足空间.解决办法: DELETE backup COMPLETED BEFORE 'SYSDATE-7';DELETE ARCHIVELOG ALL COMPLETED ...
- Illegal mix of collations for operation 'like' while searching with Ignited-Datatables
Stack Overflow Questions Developer Jobs Tags Users Log In Sign Up Join Stack Overflow to learn, sh ...
- PHP半年了,已经可以独立支撑项目,几点心得记录
从去年12开始零基础学习PHP,到现在可以独立支撑项目,感谢PHP的强大,成熟.入门容易,记录几点心得: 1.思维比什么都重要,方法要靠实践证明: 2.多写.多试,不要怕遇到坑,每一个坑都是你前进路上 ...