博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Proxy代理模式(结构型模式)
阅读量:6160 次
发布时间:2019-06-21

本文共 2399 字,大约阅读时间需要 7 分钟。

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 客户端调用程序        ///         /// 该代理的类的作用是屏蔽分布式通信的细节(如协议的处理等),客户端调用代码则不需要关注这些细节        /// 只需要关注业务        ///         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类,由于字符串的实例唯一性和字符串的不变性,关于字符串实例唯一性和字符串的不变性,参考,可以得出下面的结构图:

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类,让原先无法修改的字符串实例变得可修改,它就是可变字符串的代理类.

 

转载于:https://www.cnblogs.com/GreenLeaves/p/9827724.html

你可能感兴趣的文章
Oracle后台进程及其作用简介
查看>>
libvirt(virsh命令介绍)
查看>>
HDOJ/HDU 2555 人人都能参加第30届校田径运动会了(判断加排序~)
查看>>
service XXX does not support chkconfig
查看>>
马云乌镇致辞:技术革命最终应该机器更像机器、人更像人
查看>>
MySQL---数据库从入门走向大神系列(二)-用Java对MySQL进行增删改查
查看>>
第四章——SQLServer2008-2012资源及性能监控(1)
查看>>
基于.net开发chrome核心浏览器【五】
查看>>
[20171113]修改表结构删除列相关问题2.txt
查看>>
web应用缓存实践
查看>>
解读ASP.NET 5 & MVC6系列(6):Middleware详解
查看>>
计算从1970年到现在累计的秒数
查看>>
zlib、libzip、 libzippp 库编译(windows + cmake + vs2013)
查看>>
微信小程序开发(2) 计算器
查看>>
Asp.net SQL注入实例分享
查看>>
.Net快速获取网络文本文件最后一段文字-小应用
查看>>
shell终端行首行尾命令介绍
查看>>
mini2440 uboot使用nfs方式引导内核,文件系统
查看>>
阿里王坚:云栖小镇·中国云计算的生态
查看>>
加快你的云存储实践
查看>>