首页 技术 正文
技术 2022年11月16日
0 收藏 444 点赞 3,701 浏览 1796 个字

1、问题

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

2、解决方案

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

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

转换成

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

将一个复杂的系统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类型,可以得出下面的结构图:

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

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字符串对象就不能修改.大致的结构图如下:

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

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

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,954
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,479
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,291
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,108
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,740
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,774