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

原文地址:https://www.cnblogs.com/GreenLeaves/p/9827724.html

时间: 2024-08-02 13:03:37

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

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

  设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供一组方法给普通用户,特别方法给管理员用户?以上两种需求都非常类似,并且都需要解决一个更大的问题:你如何提供一致的接口给某个对象让它可以改变其内部功能,或者是从来不存在的功能? 可以通过引入一个新的对象,来实现对真实对象的操作或者将新的对象作为真实对象

一起学java设计模式--代理模式(结构型模式)

代理模式 应用软件所提供的桌面快捷方式是快速启动应用程序的代理,桌面快捷方式一般使用一张小图片来表示(Picture),通过调用快捷方式的run()方法将调用应用软件(Application)的run()方法.使用代理模式模拟该过程,绘制类图并编程实现. package ProxyPattern; interface Software { void run(); } class Application implements Software { public void run() { Syste

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

1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上. 通过继承一个现有类可以使得子类在拥有自身方法的同时还拥有父类的方法.但是这种方法是静态的,用户不能控制增加行为的方式和时机.如果  你希望改变一个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办?前一个,只能在于运行时完成,后者

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

1. 概述 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度? 例子1:设想如果要绘制矩形.圆形.椭圆.正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的颜色,如红色.绿色.蓝色等,此时至少有如下两种设计方案: •第一种设计方案是为每一种形状都提供一套各种颜色的版本. •第二种设计方案是根据实际需要对形状和颜色进行组合. 方案1: 方案2:  

设计模式(九):Composite组合模式 -- 结构型模式

1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 我们可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象.我们可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象.客户端代码必须区别对象简单对象和容器对象,而实际上大多数情况下用户认为它们是一样的.对这些类区别使用,使得程序更加复杂.递归使用的时候跟麻烦,而我们如何使用递归组合,使得用户不必对这些类进行区别呢? 3.

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

说明: 相对于其它模式,Flyweight模式在PHP实现似乎没有太大的意义,因为PHP的生命周期就在一个请求,请求执行完了,php占用的资源都被释放.我们只是为了学习而简单做了介绍. 1. 概述 面向对象技术可以很好地解决系统一些灵活性或可扩展性或抽象性的问题,但在很多情况下需要在系统中增加类和对象的个数.当对象数量太多时,将导致运行代价过高,带来性能下降等问题.比如:例子1:图形应用中的图元等对象.字处理应用中的字符对象等. 2.解决方案: 享元模式(Flyweight):对象结构型模式运用

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

1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性.例子1:一个电源总开关可以控制四盏灯.一个风扇.一台空调和一台电视机的启动和关闭.该电源总开关可以同时控制上述所有电器设备,电源总开关即为该系统的外观模式设计. 2. 问题 为了降低复杂性,常常将系统划分为若干个子系统.但是如何做到各个系统之间的通信和相互依赖关系达到最小呢? 3. 解决方案 外观模式:为子系统中的一组接口提供一个一致的界面,

Flyweight享元模式(结构型模式)

1.面向对象的缺点 虽然OOP能很好的解决系统抽象的问题,并且在大多数的情况下,也不会损失系统的性能.但是在某些特殊的业务下,由于对象的数量太多,采用面向对象会给系统带来难以承受的内存开销.示例代码如下: /// <summary> /// Word文字的Font样式 /// </summary> public class Font //8+8(继承object的虚表指针4个字节.垃圾收集同步占4个字节)=16个字节 { public Font(string fontName, i

结构型模式:代理模式

文章首发: 结构型模式:代理模式 七大结构型模式之七:代理模式. 简介 姓名 :代理模式 英文名 :Proxy Pattern 价值观 :为生活加点料 个人介绍 : Provide a surrogate or placeholder for another object to control access to it. 为其他对象提供一种代理以控制对这个对象的访问. (来自<设计模式之禅>) 你要的故事 咱们从事 IT 行业,随时都可能上网查东西,如果网络速度慢或者网络访问受限制,那是相当的