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

时间:2023-03-08 16:06:06
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在代理之内,我们还能额外的定义其他的逻辑,而不影响真实的业务逻辑

这就是一个代理模式

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

代理模式

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

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

代理模式中有三种角色:

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

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

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

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

相交装饰器模式

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

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

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

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

适用场景

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

优点:

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

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

缺点

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

出自:博客园-半路独行

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

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