欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入解析:4.7 PROXY(代理)模式的对象结构型设计

时间:11-12 神话故事 提交错误

大家好,今天小编来为大家解答以下的问题,关于深入解析:4.7 PROXY(代理)模式的对象结构型设计,这个很多人还不知道,现在让我们一起来看看吧!

3 动机

对对象进行访问控制的原因之一是仅在实际需要时创建并初始化它。让我们考虑一个可以在文档中嵌入图形对象的文档编辑器。有些图形对象的创建成本很高。但是打开文档必须要快,所以我们应该避免在打开文档时一次性创建所有昂贵的对象。由于并非所有这些对象同时在文档中可见,因此无需同时创建它们。

此限制意味着应根据需要创建昂贵的对象,这在图像变得可见时发生。但是我们用什么来替换文档中的这个图像呢?我们如何隐藏图像是按需创建的事实,以免使编辑器的实现变得复杂?例如,此优化不应影响绘图和格式化代码。

解决这个问题的方法是使用另一个对象,即Image Proxy,它可以替换图像对象,并负责在需要时实例化该图像对象。

图片.png

仅当文档编辑器激活图像代理的绘制操作以显示图像时,图像代理才会创建实际图像。 Proxy 将后续请求直接转发到该图像对象。所以创建了这个图像之后,就必须有这个图像的引用。

我们假设图像存储在单独的文件中。这样我们就可以使用文件名作为对实际对象的引用。代理还存储图像的范围,即其长度和宽度。有了图像大小,代理就可以响应格式化程序对图像大小的请求,而无需实际实例化图像。

下面的类图更详细地说明了这个示例。

image.png 文档编辑器通过抽象Graphic 类定义的接口访问嵌入图像。 ImageProxy是一个按需创建图像的类。 ImageProxy 将文件名保存为指向磁盘上图像文件的指针。文件名作为参数传递给ImageProxy 构造函数。

ImageProxy 还存储图像的边界框和对真实Image 实例的引用,该引用在代理实例化真实图像之前才有效。 Draw 操作必须确保在向图像转发请求之前图像已被实例化。 GetExtent 操作仅在实例化图像后才将请求传递给图像,否则,ImageProxy 将返回其存储的图像尺寸。

4 适用性

当您需要用更通用和复杂的对象指针替换简单指针时,请使用代理模式。以下是一些常见的可以使用Proxy模式的情况:

1 远程代理提供不同地址空间中对象的本地表示。 2. Virtual Proxy根据需要创建昂贵的对象; 3、Protection Proxy控制对原始对象的访问; 4.智能引用代替了简单的指针,在访问对象时执行一些操作。附加操作。统计对实际对象的引用,以便在没有对象引用时能够自动释放;当第一次引用持久对象时将其加载到内存中;在访问实际对象之前检查它是否已被锁定,以确保其他对象无法更改它。

5 结构

图像.png

下面是运行时一种可能的代理结构的对象图:

image.png

6 参与者

代理(ImageProxy)

—— 保存引用,以便代理可以访问该实体。如果RealSubject和Subject的接口相同,Proxy就会引用Subject。

—— 提供与Subject接口相同的接口,以便可以使用代理代替实体;

—— 控制对实体的访问,并可能负责创建和删除它主题(图)

—— 定义RealSubject和Proxy的公共接口,这样只要使用RealSubject的地方就可以使用Proxy;真实主题(图像)

——定义了Proxy所代表的实体。

7 协作

代理根据其类型在适当的时间将请求转发到RealSubject。

8 效果

代理模式在访问对象时引入了一定程度的间接性。根据代理的类型,附加间接有多种用途:

1 Remote Porxy 可以隐藏对象存在于不同地址空间的事实; 2 Virtual Proxy可以进行优化,比如根据请求创建对象; 3 保护代理和智能引用都允许在访问对象时进行一些额外的内务处理。 Porxy 模式还可以向用户隐藏另一种名为Copy-On-Write 的优化,该优化与按需创建对象有关。复制大型且复杂的对象是一项昂贵的操作。如果根本不修改副本,则开销是不必要的。通过使用代理来延迟这个复制过程,我们可以确保对象仅在被修改时才被复制。

实现写时复制时必须对实体进行引用计数,并且复制代理仅增加引用计数。只有当用户请求修改实体的操作时,代理才会真正复制它。在这种情况下,代理还必须减少实体的引用计数。当引用数为零时,该实体将被删除。

Copy-On-Write 可以显着降低复制大型实体的成本。

用户评论

几妆痕

这篇文章讲的是 Proxy 模式吧?一直在想要学习这个。

    有16位网友表示赞同!

丢了爱情i

4.7 版本的新设计啊?看来是更成熟了!

    有19位网友表示赞同!

岁岁年年

我对对象结构型模式不太了解,希望这篇文章能解释清楚!

    有11位网友表示赞同!

寻鱼水之欢

代理模式一直觉得挺实用的,特别是应用在网络编程方面。

    有7位网友表示赞同!

あ浅浅の嘚僾

学习一下这个 Proxy 模式,也许能提升我的设计能力。

    有17位网友表示赞同!

高冷低能儿

感觉 Proxy 模式能够让我代码更灵活一点吧?

    有8位网友表示赞同!

请在乎我1秒

Proxy 做代理功能的原理是什么样的?期待深入了解!

    有10位网友表示赞同!

红尘烟雨

这篇文章能否举例说明一下 Proxy 模式在实际开发中的应用场景?

    有15位网友表示赞同!

巷口酒肆

有没有关于 Proxy 模式优缺点的分析?

    有16位网友表示赞同!

幸好是你

我觉得学习到 Proxy 模式能够让我更好地理解软件设计。

    有14位网友表示赞同!

执念,爱

Proxy 模式的实现代码应该复杂些吧?

    有15位网友表示赞同!

红玫瑰。

最近在接触面向对象编程,正好可以看看 Proxy 模式。

    有12位网友表示赞同!

她的风骚姿势我学不来

这个 4.7 版本的 Proxy 模式跟之前的有什么不同呢?

    有10位网友表示赞同!

泪湿青衫

Proxy 模式感觉可以用在很多地方啊!

    有10位网友表示赞同!

冷嘲热讽i

学习了 Proxy 模式后,是不是更能写出高质量的代码呢?

    有19位网友表示赞同!

莫失莫忘

Proxy 模式的学习难度比较高吗?需要多少时间才能掌握?

    有5位网友表示赞同!

命里缺他

期待这篇文章能深入浅出的讲解 Proxy 模式。

    有9位网友表示赞同!

哭花了素颜

我平时开发中是否也能够使用到 Proxy 模式?

    有6位网友表示赞同!

傲世九天

Proxy 模式是不是一个很流行的设计模式呢?

    有9位网友表示赞同!

【深入解析:4.7 PROXY(代理)模式的对象结构型设计】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活