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

Proxy代理模式(结构型模式)的更多相关文章

  1. 代理模式/proxy模式/结构型模式

    代理模式proxy 定义 为其他对象提供一种代理,并以控制对这个对象的访问.最简单的理解,买东西都是要去商店的,不会去工厂. java实现三要素 proxy(代理)+subject(接口)+realS ...

  2. 设计模式(十二): Flyweight享元模式 -- 结构型模式

    说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面 ...

  3. 设计模式(十三): Proxy代理模式 -- 结构型模式

      设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路 ...

  4. 设计模式(十):Decorator装饰者模式 -- 结构型模式

    1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继 ...

  5. 设计模式学习之路——Facade 外观模式(结构型模式)

    动机: 组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战.如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系 ...

  6. 设计模式(十一):FACADE外观模式 -- 结构型模式

    1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子1:一个电源总开关可以控制四盏灯.一个风扇 ...

  7. 设计模式(八):Bridge桥接模式 -- 结构型模式

    1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度 ...

  8. 适配器模式/adapter模式/结构型模式

    定义 将类的接口转化为客户端希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作,别名Wrapper(包装器). 适配器模式,最终改变一个已有对象的接口. 使用场景 当有那么个类, ...

  9. 外观模式/facade模式/结构型模式

    外观模式 为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式三要素(client-facade-subSystem) 外观角色 ...

随机推荐

  1. MongoDB-环境搭建

    1.下载并安装MongoDB服务 下载地址:mongodb-win32-x86_64-2008plus-ssl-3.2.8-signed 可直接运行mongod命令启动MongoDB服务器,也可以将M ...

  2. JSTL安装与使用

    第一步:下载支持JSTL的文件.jakarta-taglibs-standard-1.1.2.zip 第二步:下载解压后的两个jar文件:standard.jar和jstl.jar文件拷贝到工程的\W ...

  3. PHP与Python哪个做网站产品好?

    虽然python现在比较火,但在传统的LAMP组合里Linux+apache/tomcat+MySql+PHP里是PHP做网站的脚本语言,但现在已经变了:https://baike.baidu.com ...

  4. kmp小记

    以下转载自Matrix67 ************************************************************************************** ...

  5. 7.Git与项目

    Git简介 Git是目前世界上最先进的分布式版本控制系统 安装 sudo apt-get install git 安装成功后,运行如下命令 git 产生 Linus在1991年创建了开源的Linux, ...

  6. 用Socket来简单实现IIS服务器

    刚刚接触ASP.NET编程,为了更好的屡清楚服务器的处理过程,就用Socket模拟服务器来处理请求.用Socket来模拟服务器的时候,同样是自己来封装一些对应的类文件.包括 HttpRequest.H ...

  7. .NET MVC 学习笔记(三)— MVC 数据显示

    . NET MVC 学习笔记(三)—— MVC 数据显示 在目前做的项目中,用的最多的数据展示控件就是table展示(说不是的请走开,不是一路人),以下详细阐述下table的使用方法. 先看效果: 上 ...

  8. AEAI DP开发统计分析

    1 背景概述 平时做统计分析都是调rest服务,给前台提供数据,然后在管理控制台里配置portlet.但并不是所有的项目都会用到portal,这时就需要在AEAI DP应用开发平台里开发统计分析了,下 ...

  9. openvSwitch 基本命令

    建立ovs接口连接两个namespace组成二层网络 环境搭建拓扑 br0 +--------------------------------------+ +--+ +--+ +---+ | tap ...

  10. css绘制特殊图形,meida查询,display inline-box间隙问题以及calc()函数

    本文同时发表于本人个人网站 www.yaoxiaowen.com 距离上一篇文章已经一个月了,相比于写代码,发现写文章的确是更需要坚持的事情.言归正传,梳理一下这一个月来,在写ife任务时,有必要记录 ...