引言

代理这个词语,大家在现实世界已经频繁的接触过,例如火车站代理售票点,因为这些代理售票点的存在,我们不必要去火车站的售票处就可以查询或者取到火车票.代理点本身是没有能力生产车票的,我们在代理处享受到的其实就是火车站售票处的服务,同时我们还能够在代理点享受到火车站售票处没有的服务,例如代理点有个自动售货机,我们还能够享受到购物的服务.这就是代理的优势所在

在设计模式中也有那么一种模式,与代理这个定义紧密相连,下面我将以最简洁的代码展示它

  1. /// <summary>
  2. /// 业务抽象
  3. /// </summary>
  4. public interface ISubject
  5. {
  6. void GetTicket();
  7. }

业务抽象

  1. /// <summary>
  2. /// 真正的逻辑对象
  3. /// </summary>
  4. public class RealSubject : ISubject
  5. {
  6. public void GetTicket()
  7. {
  8. Console.WriteLine(".....取票动作.....");
  9. }
  10. }

真实业务

  1. /// <summary>
  2. /// 真正业务对象的代理
  3. /// </summary>
  4. class ProxySubject:ISubject
  5. {
  6. private static ISubject _subject = null;
  7.  
  8. void ProxySubject_Init()
  9. {
  10. if (_subject == null)
  11. {
  12. _subject = new RealSubject();
  13. }
  14. }
  15.  
  16. public void GetTicket()
  17. {
  18. if (_subject == null)
  19. {
  20. ProxySubject_Init();
  21. }
  22. //AOP:日志,缓存,权限,延迟,异常
  23. _subject.GetTicket();
  24. }
  25. }

代理业务

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. var proxy = new ProxySubject();
  6. proxy.GetTicket();
  7. Console.ReadKey();
  8. }
  9. }

打印

观察上述代码我们发现它有以下特点

1上端调用的不是真实的业务对象,而是它的一个代理,真实的业务逻辑被隔离

2在代理之内,我们还能额外的定义其他的逻辑,而不影响真实的业务逻辑

这就是一个代理模式

当我们不想或不能直接调用一个业务逻辑对象,我们可以在它之上添加一个代理, 用来屏蔽具体的业务逻辑或者增加额外的业务

代理模式

因为代理本身就是一个比较简洁的思想,所以代理模式的类图也比较简单,如下:

代理模式中有三种角色:

主题的抽象角色(ISubject):真实主题和代理主题的抽象

真实的主题角色(RealSubject):真实主题,提供最根本的业务逻辑

主题的代理角色(ProxySubject):真实主题的代理,能够引用真实主题,同时添加一些额外的功能

注意:提供业务逻辑的是真实主题,而不是代理,代理只是起到引用的作用,同时可以增加一些额外的功能

相交装饰器模式

在设计模式里面,有一种设计模式叫做装饰器模式,它能够动态的为对象添加功能,

如果对这两种模式都有所了解的话,会发现他们其实有很多共同之处,同样都是具体对象与辅助对象依赖抽象的方式

例如,我们想为对象添加一个日志的功能:我们既可以选择为它添加一个代理来实现,也可以选择添加一个装饰器来实现,这个时候我们可能会迷惑,添加的到底是代理还是装饰器

对于它们的区别,从他们出发的场景来比较是最好的,从出发场景来看,装饰器模式注重的是对原有对象功能的扩展,而代理模式注重的是对原有对象的控制或屏蔽,个人觉得这是他们最大的区别

适用场景

当我们不想或不能直接调用一个业务逻辑对象,我们可以在它之上添加一个代理, 用来屏蔽具体的业务逻辑或者增加额外的业务

优点:

1降低了系统的耦合度,这是设计模式比较共通的优点;

2能够屏蔽真实的业务逻辑,同时还能额外增加功能

缺点

使用了代理模式,需要增加代理类,必然会增加系统的复杂程度

出自:博客园-半路独行

原文地址:https://www.cnblogs.com/banluduxing/p/9267705.html

本文出自于http://www.cnblogs.com/banluduxing 转载请注明出处。

c#设计模式之代理模式(Proxy Pattern)的更多相关文章

  1. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)

    原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...

  2. 二十四种设计模式:代理模式(Proxy Pattern)

    代理模式(Proxy Pattern) 介绍为其他对象提供一个代理以控制对这个对象的访问. 示例有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对 ...

  3. 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)【转】

    介绍 为其他对象提供一个代理以控制对这个对象的访问. 示例 有一个Message实体类,某对象对它的操作有Insert()和Get()方法,用一个代理来控制对这个对象的访问. MessageModel ...

  4. 设计模式系列之代理模式(Proxy Pattern)——对象的间接访问

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  5. 设计模式 - 代理模式(proxy pattern) 未使用代理模式 具体解释

    代理模式(proxy pattern) 未使用代理模式 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 部分代码參考: http://blog.csdn. ...

  6. 代理模式(Proxy pattern)

    代理模式(proxy pattern):作用:为其他对象提供一种代理,以控制对这个对象的访问.代理对象在客户端对象和目标对象之间起中介的作用. 代理模式涉及到的角色: 抽象角色:声明真实对象和代理对象 ...

  7. 设计模式——代理模式(Proxy Pattern)

    代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. UML图: 模型设计: Subject类: package com.cnblog.clarck; /** * Subject 类 ...

  8. 13.代理模式(Proxy Pattern)

    using System; namespace Test { //抽象角色:声明真实对象和代理对象的共同接口. //代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象, //同时代理 ...

  9. 大熊君说说JS与设计模式之------代理模式Proxy

    一,总体概要 1,笔者浅谈 当我们浏览网页时,网页中的图片有时不会立即展示出来,这就是通过虚拟代理来替代了真实的图片,而代理存储了真实图片的路径和尺寸,这就是代理方式的一种. 代理模式是比较有用途的一 ...

随机推荐

  1. 常见报表的JS代码

    1.合并单元格 这个表格在报表里面算是比较典型的 1.里面的表格的列标题现在是写死的,其实这些可以通过配置进行 2.至于如果表头要进行合并(这种需求比较少,也比较容易实现) 3.至于统计:最好在后台按 ...

  2. 使用css弹性盒子模型

    提示: 当期内容不充实, 修改后再来看吧 以下称:弹性子元素: 子元素, 弹性容器: 容器 弹性盒子的属性 1. css弹性盒子模型规定了弹性元素如何在弹性容器内展示 2. 弹性元素默认显示在弹性容器 ...

  3. 43.国际化-app级别的资源文件

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 在src目录下建立两个资源文件,取名为myapp_en_US.propert ...

  4. 获取当前函数名 __FUNCTION__ 的使用<转>

    vs项目中见过这种获取 当前函数名的调用.觉得挺方便的就记录一下. ============================================================== 转载地 ...

  5. 小学生轻松做题App

    作业链接:https://edu.cnblogs.com/campus/fzzcxy/2016SE/homework/2180 原型模型设计工具:墨刀 原型模型链接:https://modao.cc/ ...

  6. python 把txt文件分隔成0.8和0.2的比例的新文件

    from math import sqrt import randomimport osfrom sklearn import cross_validation os.chdir("/*&q ...

  7. lda spark 代码官方文档

    http://spark.apache.org/docs/1.6.1/mllib-clustering.html#latent-dirichlet-allocation-lda http://spar ...

  8. archiver error. Connect internal only, until freed. 之解决办法

    这个报错说的是数据库的日志备份不足空间.解决办法: DELETE backup COMPLETED BEFORE 'SYSDATE-7';DELETE ARCHIVELOG ALL COMPLETED ...

  9. 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 ...

  10. PHP半年了,已经可以独立支撑项目,几点心得记录

    从去年12开始零基础学习PHP,到现在可以独立支撑项目,感谢PHP的强大,成熟.入门容易,记录几点心得: 1.思维比什么都重要,方法要靠实践证明: 2.多写.多试,不要怕遇到坑,每一个坑都是你前进路上 ...