zoukankan      html  css  js  c++  java
  • Proxy代理模式

    >>返回《C#常用设计模式》

    1. 简介

    • 定义

      • 代理模式(Proxy)为另一个对象提供一个替身或占位符以控制对这个对象的访问,简而言之就是用一个对象来代表另一个对象。
    • 意图

      • 提供其他对象一个代理或占位符,来控制该对象的访问权限。
    • 动机

      • 通过控制来延迟对象的创建和实例化,直到真正需要使用该对象才进行创建和实例化。
        • 由于一些对象创建和实例化需要占用大量系统资源,但我们并不能确定用户一定会调用该对象,所以通过延迟对象实例化来减缓系统资源的消耗。
    • 经典实例

      1. EF中在Proxy代理模式下的对象都是代理对象,起到延迟加载导航属性的作用(访问时加载)
      2. Castle包中的动态代理
    • 常见的代理模式设计

      • 远程代理
        • 为一个位于不同的地址空间的对象提供一个局域代表对象。
        • 好处是系统可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。
      • 虚拟代理
        • 根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。
        • 代理可以对加载的过程加以必要的优化,达到节省资源的最用
      • Copy-on-Write代理
        • 虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。(StringBuilder、EF中的Entity代理)
      • 智能引用(Smart Reference)代理
        • 当一个对象被引用时,提供一些额外的操作,比如将对此对象调用的次数记录下来等
      • 保护代理(Protect Proxy)
        • 控制对一个对象的访问,可以给不同的用户提供不同级别的使用权限。
      • 缓冲代理(Cache Proxy)
        • 为某一个目标操作的结果提供临时的存储空间,以便多个程序调用可以共享这些结果,如:Abp中DbContext对象使用上的设计。
    • 类图

      • 以智能引用代理为例

    2. 示例

    class Program
    {
        static void Main()
        {
            //这里方式可以更智能,比如使用IOC实例化,并实现动态代理
            Subject obj=new Proxy();
            obj.Request();
        }
    }
    
    public abstract class Subject
    {
        public abstract void Request();
    }
    
    public class RealSubject : Subject
    {
        public override void Request()
        {
            //业务方法具体实现代码
        }
    }
    
    public class Proxy : Subject
    {
        private RealSubject realSubject = new RealSubject(); //维持一个对真实主题对象的引用
     
        public void PreRequest() 
        {
            //... ...
        }
     
        public override void Request() 
        {
            PreRequest();
            realSubject.Request(); //调用真实主题对象的方法
             PostRequest();
        }
     
        public void PostRequest() 
        {
            //... ...
        }
    }
    

    如果您认为这篇文章还不错或者有所收获,您可以通过右边的"打赏"功能 打赏我一杯咖啡【物质支持】,也可以点击左下角的【好文要顶】按钮【精神支持】,因为这两种支持都是我继续写作,分享的最大动力!

    作者: 大师兄石头
    来源: https://bigbrotherstone.cnblogs.com/
    声明: 原创博客请在转载时保留原文链接或者在文章开头加上本人博客地址,如发现错误,欢迎批评指正。凡是转载于本人的文章,不能设置打赏功能,如有特殊需求请与本人联系!

  • 相关阅读:
    Axure RP 9 Beta 开放下载(更新激活密钥和汉化包)
    Android 解决NestedScrollView 嵌套 RecyclerView出现的卡顿,上拉刷新无效
    上周热点回顾(8.27-9.2)团队
    上周热点回顾(8.20-8.26)团队
    上周热点回顾(8.13-8.19)团队
    上周热点回顾(8.6-8.12)团队
    阿里云MVP第6期招募与博客园合作启动团队
    上周热点回顾(7.30-8.5)团队
    上周热点回顾(7.23-7.29)团队
    上周热点回顾(7.16-7.22)团队
  • 原文地址:https://www.cnblogs.com/BigBrotherStone/p/proxy.html
Copyright © 2011-2022 走看看