半路独行

c#设计模式之代理模式(Proxy Pattern)

引言

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

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

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

posted @ 2018-07-05 18:40  半路独行  阅读(388)  评论(0编辑  收藏  举报