目录

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

代理模式(Proxy)

代理模式是一种结构型设计模式,它可以为其他对象提供一种代理以控制对这个对象的访问。

就是说代理类与被代理的类具有相同的接口, 然后客户端必须通过代理类来与被代理的类进行交互. 而代理一般在交互的前后进行某些特定的处理.

【设计模式】代理模式 随笔 第1张

proxy模式的类型

remote proxy

【设计模式】代理模式 随笔 第2张

一般去handel client对于远程service的调用. 适用于被代理的subject为web service, 或者是web api. 然后client通过proxy访问这些远程service. 在我的项目经验中, Odata就符合remote proxy.

virtual proxy

这种代理模式比较灵活, client在构造代理的实例时传递的不是代理类的实例, 而是初始化代理类的实例的参数.

    //Client code
    VirtualProxy subject = new VirtualProxy("XiaoMing");
    subject.Visit();

    /// <summary>
    /// proxy code
    /// 通过参数来实例化一个subject,而不是直接将subject通过参数传递.
    /// </summary>
    public class VirtualProxy : ISubject
    {
        private string name;
        private ISubject subject;
        public VirtualProxy() { }

        public VirtualProxy(string name)
        {
            this.name = name;
        }
        
        public void Visit()
        {
            subject = new RealSubject(this.name);
            subject.Visit();
        }
    }

    //real subject
    public class RealSubject : ISubject
    {
        private string name = "";

        public RealSubject() { }

        /// <summary>
        /// for virtual proxy mode
        /// </summary>
        /// <param name="name"></param>
        public RealSubject(string name)
        {
            this.name = name;
        }

        public void Visit()
        {
            Console.WriteLine(name);
        }
    }

protection proxy

一般是保护real subject的访问者必须是经过授权的. 比如下面的代码demo中, 没有授权的client的访问时不被允许的.

【设计模式】代理模式 随笔 第3张

静态代理 和 动态代理

静态代理有其比较明显的缺点就是代理类必须实现被代理的类的接口里面的所有方法.
如果被代理的类很多, 也就是说代理类需要继承很多接口, 进而导致代理类特别臃肿,灵活性降低.

代理模式的几种使用技巧

  • 利用代理进行缓存数据

    代理类中添加一个静态缓存, 可以做到缓存数据的解决方案
  • 利用代理进行延迟加载

    同样是对于代理模式里面, 对于real subject的实例化延迟进行初始化.可以防止资源消耗
  • 利用代理实现单例

    这个一般使用静态的real subject

  • 利用代理实现权限校验

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄