专栏首页GreenLeavesProxy代理模式(结构型模式)

Proxy代理模式(结构型模式)

1、问题

在面向对象系统中,有些对象由于某种原因(比如创建对象的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给调用者带来麻烦,那么如何在不损失接口透明性的情况下,解决这些麻烦?

2、解决方案

通过架设一层中间层,让这层中间层来解决上面的麻烦,也就是我们所说的代理。大致的结构转换图如下:

转换成

将一个复杂的系统A,通过假设一层中间层C,将A中的复杂度处理掉,并通过C向B提供一种更灵活,满足B需求的方案.

案例一、.Net中WebService技术提供了很好的借鉴.代码如下:

        #region 基于.Net WebService的分布式服务
        public interface IUser
        {
            void GetUser();


            void AddUser();

            void UpdateUser();

            void DeleteUser();
        }

        public class User : IUser
        {
            public void AddUser() { }

            public void DeleteUser() { }

            public void GetUser() { }

            public void UpdateUser() { }
        }
        #endregion


        #region 客户端调用程序
        /// <summary>
        /// 该代理的类的作用是屏蔽分布式通信的细节(如协议的处理等),客户端调用代码则不需要关注这些细节
        /// 只需要关注业务
        /// </summary>
        public class UserProxy : IUser
        {
            public UserProxy()
            {
                //对对象创建的一种Soap封装
            }

            public void GetUser()
            {
                //对对象访问的一种Soap封装
                //发送Soap数据,执行分布式服务中的业务代码
                //如果有返回值,接受返回值Soap数据,解包,转换成C#代码
            }

            public void AddUser() { }


            public void DeleteUser() { }

            public void UpdateUser() { }
        }

通过UserProxy类,该类将soap协议的相关处理完成,然后客户端调用类就不需要关心soap协议的处理,只需要关心业务代码如下调用即可,这就是代理类的作用.

案例二、StringBuilder的Copy-on-Wirte技术

                StringBuilder sbOne = new StringBuilder("Hello World");
                StringBuilder sbTwo = new StringBuilder("Hello World");
                StringBuilder sbThree = new StringBuilder("Hello World");

上面的代码创建了3个StringBuilder类,由于字符串的实例唯一性和字符串的不变性,关于字符串实例唯一性和字符串的不变性,参考字符、字符串和文本的处理之String类型,可以得出下面的结构图:

3个StringBuilder实例都指向"Hello World"字符串实例,但是当其中一个StringBuilder执行了Replace方法,如果按照这个结构的话,当一个实例对字符串进行修修改操作,那么其它两个实例也会共享这个修改操作.但实际上,StringBuilder并不是这样操作的.因为StringBuilder代表的是可变字符串.所以当对StringBuilder实例进行修改对应的字符串也要发生改变,接下来看StringBuilder是如何使用Copy On Write技术对字符串实例进行修改的,代码如下:

                StringBuilder sbOne = new StringBuilder("Hello World");
                StringBuilder sbTwo = new StringBuilder("Hello World");
                StringBuilder sbThree = new StringBuilder("Hello World");
                sbThree.Replace("Hello World", "小超");
                Console.WriteLine(sbThree);//输出小超

根据输出,发现同一个StringBuilder实例,可以修改它的值,但是String字符串对象就不能修改.大致的结构图如下:

这就是Copy On Write技术,而StringBuilder类就相当于一个代理类,它代理的是String类,让原先无法修改的字符串实例变得可修改,它就是可变字符串的代理类.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C# 高效率创建字符串类(StringBuilder)

    因为String类型代表不可变字符串,所以无法对当前String类型实例进行处理.所以FCL提供了System.Text.StringBuilder类型,它可以...

    郑小超.
  • 八、通用类型系统

    1、通用类型简介         CLR中的一切都围绕类型展开,因为IL是面向对象的高级机器语言.类型向应用程序和其他类型公开了功能.通过类型,用一种编程语言写...

    郑小超.
  • 二、源代码=>程序集及程序集概念介绍

    文本脉络图如下: ? 一、源代码-面向CLR的编译器-托管模块-(元数据&IL代码)中介绍了编译器将源文件编译成托管模块(中间语言和元数据),本文主要介绍如何将...

    郑小超.
  • 『设计模式』我能进来坐坐吗?--访问者模式

    访问者( Visitor )模式的定义: 将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操...

    风骨散人Chiam
  • Java面向对象OOP

    (1)、单一职责原则(Single Responsibility Principle)

    用户2802329
  • Python获取本机所有网卡ip,掩码和广播地址

    forrestlin
  • 手把手教你利用Python网络爬虫获取旅游景点信息

    当我们出去旅游时,会看这个地方有哪些旅游景点,景点价格、开放时间、用户的评论等。

    用户1564362
  • 小程序 · 一周报

    6 月 21 日,微信升级小程序插件能力:开放插件登录能力;支持在插件内使用微信支付能力,便于用户在插件内完成预订、购买等流程;新增全页面插件,开发者可开发完整...

    极乐君
  • 手把手教你利用Python网络爬虫获取旅游景点信息

    当我们出去旅游时,会看这个地方有哪些旅游景点,景点价格、开放时间、用户的评论等。

    Python进阶者
  • 【盘点】2014年英国十大科技公司收购案

    大数据文摘

扫码关注云+社区

领取腾讯云代金券