自序
zhangxun.com 是正在开发中的一个软件工程知识库(knowledge base)和 OO 技术试验台(test bed),软件设计模式库是其中的一项重要内容。本站的开发运用了许多成熟的软件设计和实现技术,包括 OOAD、用例分析、UML 建模、架构设计模式、前构与重构、演进式设计、OO 框架、自动化测试等等敏捷开发实践。
10 年前(1997),张恂有幸第一次接触到了设计模式(先是 ACE,然后才是 GoF);10 年后,张恂终于迈出了职业生涯中的重要一步:动手编撰和整理新的设计模式。自 2005 年起,在递增式的开发过程中,通过前构与重构手法,本站逐步采用了近二、三十个(架构)设计模式,它们中的有些可能与已知的经典设计模式相似、相合,而有些似乎还未见诸公开报道。
本质上,张恂是一名敏捷的 OO 程序员。记录这些架构模式和设计模式,首先是出于对 OO 技术的热爱。而且张恂笃信,能够熟练地掌握和运用软件架构设计模式,始终是一名软件架构师、软件设计工程师必须具备的最重要技能之一,因此很乐意通过此栏目与大家分享我的所学和所得。
Simple Name Locator (6871)中文名:简名寻址 用一个简单易记的名称(助记符)来标识重要的网站资源(Web Resource),使得网站对外公开的 URL 更加稳定和简单。通过把网站统一入口(Entry Page)作为资源定位器,实现网站资源的动态、间接寻址(访问),以及资源逻辑地址(URL)与实际物理文件地址路径的解耦。 Entry Page中文名:入口页(面) 实现网站资源简名寻址(Simple Name Locator)的统一定位器,还承担为目标资源挑选合适的显示模版等职责。 Web Resource中文名:Web 资源 别名:Virtual Page/Virtual Resource(虚拟页/虚拟资源),Web Object 用户通过 URL 访问的不再是一个孤立、单一的页面(比如服务器上的一个静态文件,或者一次动态的数据库查询结果),在本模式下 URL 标识的是一个逻辑的、完全虚拟的 Web 资源(通过 Simple Name Locator 模式),而这个虚拟资源可能由多个静态或动态的页面、文件以及其他子资源组成,我们还可以为这些资源动态地设置元数据。 * 在不少开发环境中,“Web 资源”是指一些除基本内容之外的,辅助图片、图标、音视频等多媒体文件(资源),这与本模式的含义全然不同。
Automatic Backup And Restore中文名:(Web 资源的)自动备份与复原 Web 网站会大量采用数据文件(如 XML)和数据库来存储各种信息,而实际上许多主流数据库管理系统也是采用物理文件来存放逻辑的数据库。 只要是电子媒介,就存在不可靠性。万一由于各种各样的原因,硬盘上的目标数据文件损坏、丢失了怎么办?在 Web 应用系统中,为保证软件运行的正确性和不间断性,提高系统可靠性,针对 Web 资源开发一套轻量级的、自动备份与复原机制是可行的有效办法之一。 View Caching中文名:视图缓存 Web 页面上显示的很多内容来自于数据库的动态查询,而有些数据库的查询操作不但复杂而且费时,如果每次页面访问或刷新都要重新执行一遍这些昂贵的数据库操作的话,将会严重影响系统的性能。当后台的数据状态实际没有发生变化,导致数据库查询结果不会变化,从而客户端视图的显示结果更不会变化时,执行这样的数据库查询无疑是多余、相当不划算的。 这时,引入视图缓存是一个好办法,让客户程序直接去读查询结果或显示缓存(比如一个 XML 文件的内存映像),而不是去执行数据库逻辑。张恂发现由此带来的性能改进往往可以达到 3-5 倍以上。 |
Template Content Separation中文名:模版与内容分离 在一个 Web 应用系统中(比如网站系统),大量 Web 资源在客户端浏览器上的显示通常都要求具有相同的外观和布局,这一统一的界面外观、布局、风格、样式等展现元素可以用一个统一的模版(Template)来表示和实现,而所有采用了统一模版的虚拟 Web 资源视图(View)的区别之处仅在于显示/输出的具体内容(Content)各有不同。相同的格式模版仅有一个,不同的表现内容却可以成千上万,必要时我们还可以非常灵活地动态、实时切换内容的展现模版,这样就通过“变与不变”的有效分离,实现了信息数据和业务逻辑处理的效率最佳配置。 可见,TCS 模式也是所有 Web 应用中最为常见的架构模式之一。 Custom Content Control中文名:自定义内容控件 别名:Embedded Content Control(嵌入式内容控件) 采用了模版与内容分离模式(TCS)后,模版对象(Template)存放了公共的 UI 展现信息,而发布到客户端的主体信息数据实际存放在内容对象(Content)中。 通常模版对象借用诸如 ASP.NET、JSP 这样的动态页面机制实现,内容对象数据的存储用结构化的数据文件(比如 XML 文件)来实现。而采用静态文件描述信息数据的一个问题是,如何才能像前端的 ASP.NET、JSP 模版页面那样,实现静态数据(标记)与动态数据(标记)的无缝集成,以及后端内容数据文件的动态生成和扩展呢? 借鉴 ASP.NET、JSP 服务器页面处理机制,针对 XML 数据文件引入一种定制的、嵌入式控件处理引擎,是一种可行的解决方案。基于 Reflection 技术,我们可以实现各类服务器控件(包括系统缺省控件以及开发者自定义控件)在模版对象、内容对象之间的轻松移植和重用。 Web Paging中文名:Web 分页 别名:分页 许多时候,企图用一个 Web 页面(HTTP Response 的返回结果)来显示某个复杂 Web 资源的所有输出内容是个坏主意,由于内容太长、太多了(比如 5000 条记录、数万字的文档),意味着用户不得不频繁地使用 PageUp/PageDown 在一个页面内进行翻滚,而更糟的是,这么做往往会显著地增加系统响应时间,让等待结果的用户无法忍受。 因此, Web 资源的分页输出和显示恐怕是所有 Web 系统中应用最为广泛的架构设计模式之一,我们发现它又可以进一步细分为静态分页和动态分页两种模式。 Static Paging中文名:静态分页 通过人工设置一些固定的标记/标签,将静态 Web 资源(比如一份较长的文档)划分成多个部分(子页面),以便在客户端显示。 Dynamic Paging (3288)中文名:动态分页 通过设定每个子页面输出显示的统一信息容量(长度),让软件对内容总长度不固定、可能随时发生变化的动态 Web 资源(比如数据库查询结果、评论消息、论坛某主题下的所有帖子集合等)进行实时自动分页。 |
