引言

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

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

    /// <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 转载请注明出处。

最新文章

  1. Block入门
  2. 转:如何调试PHP的Core之获取基本信息
  3. chenxi的html学习笔记
  4. Android项目实战(九):CustomShapeImageView 自定义形状的ImageView
  5. Object C学习笔记26-文件管理(二)
  6. 为 Oracle Database 开发 WCF Data Services 和 OData 应用程序
  7. windows重装后,不重装oracle,直接恢复数据库
  8. ssh操作服务器
  9. Tomcat版本对照表
  10. MySQL连接java
  11. PLSQL 使用技巧汇总贴(一个坑)
  12. sscanf,sprintf 通过字符串与其它类型进行方便快捷的输入和输出
  13. Python中re(正则表达式)模块学习
  14. Linux上printf命令的用法
  15. .Net(c#)打印--多页打印
  16. 解决springmvc使用ResponseBody注解返回json中文乱码问题
  17. Python常用第三方模块(长期更新)
  18. 【题解】P1516 青蛙的约会(Exgcd)
  19. codeforces 798C.Mike and gcd problem 解题报告
  20. 理解 JavaScript 作用域(转)

热门文章

  1. PG自动化测试
  2. VCF文件导入导出
  3. Python算法应用实战之队列详解
  4. .net 架构
  5. Access空字符串和Null值
  6. [X264] MinGW编译x264,VC中调用libx264.dll-------------&lt;参考转&gt;
  7. 在coursera上有哪些值得推荐的课程
  8. 启动tomcat报:No Spring WebApplicationInitializer types detected on classpath
  9. hadoop之HDFS学习笔记(二)
  10. Navigation and Pathfinding