3.6 《硬啃设计模式》 第15章 超级文档编辑器 - 代理模式(Proxy Pattern)

本文主要是介绍3.6 《硬啃设计模式》 第15章 超级文档编辑器 - 代理模式(Proxy Pattern),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

你要做一个能和Word比美的文档编辑器,其中一个重大功能是:文档中能插入很多图片。
但如果文档的图片太多,文档加载的速度将会变得很慢,于是你想到的方法是不必所有图片都直接显示出来,可以先显示一个带叉叉的虚拟图片,当用户停留在当前图片时,才加载真正的图片。
不过除了图片,如 视频 、flash等其它可能需要耗大量资源的东西可能也需要这样处理。
你打算如何设计呢?

最开始你的设计是这样的:

代理1.png  

这个设计的要点如下:
1.文档中的图片、Flash、多媒体等元素,都实现了Element接口。
2.DocumentEditor可以不区别是Graphic、Flash还是Media,只需要调用Draw()方法,就可以在屏幕上画出相应的东西来。
3.如果以后需要增加新的元素,只需要实现Element接口就可以了,DocumentEditor不需要修改代码。
说明:DocumentEditor不一定是具体的一个类,是泛指除了Element、Graphic、Flash、Media以外的程序。

这个设计其实挺漂亮的,不过还有这样的问题未解决:
1.对于Graphic,如何先显示一个带叉叉的虚拟图片呢?而Flash、Media应该先显示什么虚拟的东西呢?
2.显示虚拟东西的代码写到哪里呢?在DocumentEditor写吗?还是在Graphic、Flash、Media中各自处理?
   1)如果在DocumentEditor写这些代码,则需要在DocumentEditor中写一堆 if else 或者是 switch case ,以后每增加一种元素就要修改这些代码,麻烦!
   2)如果在Graphic、Flash、Media中各自搞定,那么需要在各自的Draw()方法中各自判断当前是需要画虚拟东西还是画具体的内容。这样做好像还可以,不过好像将这些判断逻辑写进各类中似乎增加了各类的责任,总觉得不太合适,如果能分离出来就好了。

应用了代理模式的设计如下:

代理2.png  

说明:
1.本设计在原来设计的基础上,为Graphic、Flash、Media各自增了两对应的Proxy。
2.这些Proxy都实现了Element接口,并且含有对应被代理的类的引用。
3.每个Proxy要判断当前需要画虚拟的东西还是画具体的内容,如果需要画虚拟的东西,则由自己来处理,如果需要画具体的内容,则调用被代理类的Draw()方法。
4.对于DocumentEditor来说,它实际得到的是一个一个Proxy,但因为Proxy同样也是实现了Element接口,所以DocumentEditor的代码不需要做任何修改。
5.如果需要增加一个新元素,则需要增加一个类以及它的Proxy,都实现Element接口便可。
代理模式精妙之点在于代理和被代理者实现了相同的接口,包揽了被代理者不适合干的事情,对于外界来说,只要访问代理就可以了,反正它会包办一切。

以下情况可考虑应用代理模式:
1.不希望某些类被直接访问。
2.访问之前希望先进行一些预处理。

3.希望对被访问的对象进行内存、权限等方面的控制。





请看下一文……

作者:张传波

创新工场创业课堂(敏捷课程)讲师

软件研发管理资深顾问

CMMI首席专家

《火球——UML大战需求分析》作者

《硬啃设计模式》作者

www.umlonline.org创办人



这篇关于3.6 《硬啃设计模式》 第15章 超级文档编辑器 - 代理模式(Proxy Pattern)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/996111

相关文章

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

Python使用python-docx实现自动化处理Word文档

《Python使用python-docx实现自动化处理Word文档》这篇文章主要为大家展示了Python如何通过代码实现段落样式复制,HTML表格转Word表格以及动态生成可定制化模板的功能,感兴趣的... 目录一、引言二、核心功能模块解析1. 段落样式与图片复制2. html表格转Word表格3. 模板生

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S

Python+wxPython构建图像编辑器

《Python+wxPython构建图像编辑器》图像编辑应用是学习GUI编程和图像处理的绝佳项目,本教程中,我们将使用wxPython,一个跨平台的PythonGUI工具包,构建一个简单的... 目录引言环境设置创建主窗口加载和显示图像实现绘制工具矩形绘制箭头绘制文字绘制临时绘制处理缩放和旋转缩放旋转保存编

Redis高可用-主从复制、哨兵模式与集群模式详解

《Redis高可用-主从复制、哨兵模式与集群模式详解》:本文主要介绍Redis高可用-主从复制、哨兵模式与集群模式的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Redis高可用-主从复制、哨兵模式与集群模式概要一、主从复制(Master-Slave Repli

浅谈Redis Key 命名规范文档

《浅谈RedisKey命名规范文档》本文介绍了Redis键名命名规范,包括命名格式、具体规范、数据类型扩展命名、时间敏感型键名、规范总结以及实际应用示例,感兴趣的可以了解一下... 目录1. 命名格式格式模板:示例:2. 具体规范2.1 小写命名2.2 使用冒号分隔层级2.3 标识符命名3. 数据类型扩展命