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

  • 相关阅读:
    JS 中 == 和 === 区别是什么?
    说说事务的概念,在JDBC编程中处理事务的步骤
    JDBC访问数据库的基本步骤是什么?
    undefined,null 和 undeclared 有什么区别?
    Mybatis框架、什么是 MyBatis、#{}和${}的区别是什么?、Mybatis 动态 sql 是做什么的?都有、为什么说 Mybatis 是半自动 ORM 映射工具?它与全自动的区别在哪里?
    什么是CDN?哪些是流行的jQuery CDN?使用CDN有什么好处?
    MyBatis 与 Hibernate 有哪些不同?
    Redis如何做内存优化?
    shiro有哪些组件?
    简述Shiro的核心组件?
  • 原文地址:https://www.cnblogs.com/banluduxing/p/9267705.html
Copyright © 2020-2023  润新知