装饰器模式概述
为了开始,我们将介绍一些关于装饰器设计模式的背景知识。一种通用的技术,来定义一个通用的界面,这个界面将会同时被你的初始的对象和装饰器同时应用;你的装饰器然后接受初始化的对象作为一种依赖,将代理或者重写它的方法。让我们把它转为代码,来更易于理解:
然后你为 StandardWindow 类型创建一个对象,把它传递 LockedWindow 的构造函数,你的 window 对象现在有了不同的行为。它的迷人之处在于,你不必应用在你的 standard window 类上的任何种类的 locking 功能。同时,你可以传递你的 locked window,好象它是另外一个 window。
装饰器模式的一个特别有用之处,是创建对象的原文表现。举例来说,你可能有一个 Person 对象,它自己本身,没有文字表现。通过使用装饰器模式,你可以创建一个对象,它扮演起来,就象它就是一个 Person,而且提供了文字呈现那个 Person 的功能。
在这个特定的例子中,我们将使用 duck typing 而不是一个精确的接口。这使我们的应用程序更加具有弹性,同时还允许装饰器对象如同一个 Person 对象一样行动。
在这个例子中,你把你的 Person 实例传递给 TextPerson 构造函数。通过使用方法重载,你可以能够继续调用 构造函数。通过使用方法重载,你可以能够继续调用 构造函数。通过使用方法重载,你可以能够继续调用 Person 的全部方法——设定姓,名,或者性别——但是你现在通过 __toString() 方法也获得了一个字符串表现。
后面的一个例子和 Zend_Form 的装饰器更接近。关键的不同之处是,作为一个装饰器包裹元素的代替,元素有一个或者更多装饰器附加到它身上,然后它注入自己来呈现。装饰器然后可以访问元素的方法和属性来达到为元素创建一个表现的目的——或者它(元素?)的一个子集。
创建你的第一个装饰器
Zend_Form 装饰器都应用一个通用的接口,Zend_Form_Decorator_Interface。那个接口提供了设置装饰器特定的选项,注册和检索元素,以及呈现的功能。一个基本的装饰器,Zend_Form_Decorator_Abstact,提供了大部分的你将需要的功能,同时还有呈现逻辑的异常。
让我们考虑一种情形,就是我们只是希望把一个元素当作一个带有 label 的标准表单文字 input 来呈现。我们不担心错误处理或者现在这个元素是否应该被其它的标签包裹——只是基本的。这样一个装饰器可能看起来象这样:
让我们创建一个使用这个装饰器的元素:
呈现这个元素将得到以下的标记结果:
你也可以把这个类放到你的库文件的某个地方,把路径通知你的元素,指向装饰器,如同简单的 SimpleInput:
这样给了你在其它项目中重复使用的好处,也打开了以后为了那个装饰器提供其它应用的大门。
在下一章中,我们会学习如何结合装饰器来创建组合输出。
分享到:
相关推荐
libzip的源代码和文档都是开放的,开发者可以通过阅读源码和官方文档深入理解其内部机制,以便更好地利用这个库。 总的来说,libzip库在1.10.1版本中不仅保持了原有的强大功能,还进一步优化了安全性、性能和易用性...
本文将深入解析jQuery 1.10.1中文汉化二版,旨在帮助初学者及有经验的开发者更好地理解和运用这一版本。 首先,jQuery的核心理念是"Write Less, Do More",它通过提供一套统一且易于使用的API,极大地简化了DOM操作...
汉化使得中国用户能够更容易地理解和操作SVN,避免了语言障碍,提高了使用体验。 "汉化包"是实现软件汉化的一组文件,通常由社区成员或者开发者提供,将原本的英文界面转换为中文。汉化包的使用可以极大地降低非...
标题中的"synergy1.10.1.rar"是一个压缩包文件,其版本号为1.10.1,通常这种格式的文件是使用RAR压缩算法打包的,它可能包含了软件安装所需的所有文件。RAR是一种常见的文件压缩格式,由WinRAR软件创建,允许用户将...
赠送jar包:parquet-column-1.10.1.jar; 赠送原API文档:parquet-column-1.10.1-javadoc.jar; 赠送源代码:parquet-column-1.10.1-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
2. **解析器**:Heritrix支持多种解析引擎,如HTML解析器和XML解析器,用于提取和理解网页内容。解析器可以识别出链接,以便进一步抓取,也可以处理JavaScript和其他动态内容。 3. **存储器**:抓取到的数据会被...
HDF5(Hierarchical Data Format 5)是一种用于存储和管理大量复杂数据的开源文件格式。...对于开发者来说,理解和掌握HDF5的使用可以极大地提高数据处理和分析的效率,特别是在处理大规模科学数据或深度学习模型时。
安装过程中,通常会包含`pyvisa`和`pyvisaSCPI`这两个关键组件,它们分别负责基础的仪器通信和SCPI命令的解析与执行。 `pyvisaSCPI`是PyVISA的一个重要扩展,SCPI是一种国际标准的编程语言,用于控制和配置科学仪器...
Numpy是Python编程语言中的一个核心库,专用于科学计算,尤其在处理多维数据时。这个"numpy-1.10.1.zip"文件是一个包含Numpy 1.10.1版本源代码的...正确安装和理解Numpy的特性是提升Python编程效率的关键步骤之一。
libpcap是许多网络安全工具,如tcpdump和Wireshark的基础。 **一、libpcap的功能与应用** 1. **数据包捕获**:libpcap能够直接与网络设备驱动交互,获取通过网络接口的数据包,无论是发送还是接收的。 2. **过滤...
《jQuery UI 1.10.1 自定义版本详解》 jQuery UI 是一个基于 jQuery JavaScript 库的可扩展用户界面库。...通过理解其核心特性、组件和自定义方法,开发者可以更好地利用这一库来提升项目的用户体验。
而“poco-1.10.1-all-build”则可能包含了预编译的库文件和构建系统,方便用户快速在特定平台上集成和使用Poco。通常,这样的构建目录会包括不同平台和配置的编译结果,如动态库、静态库、头文件等。对于那些不打算...
《jQuery 1.10.1:开源代码与jQuery UI 1.10.1定制》 jQuery,作为一款广泛使用的JavaScript库,以其简洁的API和强大的功能深受开发者喜爱。1.10.1版本是jQuery历史上的一个重要里程碑,它在前一版本的基础上进行了...
赠送jar包:parquet-hadoop-1.10.1.jar 赠送原API文档:parquet-hadoop-1.10.1-javadoc.jar 赠送源代码:parquet-hadoop-1.10.1-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
VSCode 1.10.1绿色版让用户能够在不干扰现有系统设置的情况下运行和使用这个编辑器,这对于共享电脑或在受限环境下的开发者尤其方便。 **核心特性** 1. **多语言支持**:VSCode内置了对JavaScript、TypeScript、...
SVN(Subversion)是一种广泛使用的版本控制系统,用于管理软件项目的源代码和其他文件。它允许开发者在团队中协作,跟踪每一次更改,同时提供回溯和恢复功能。SVN1.10.1是Subversion的一个特定版本,包含了若干增强...
Tensorflow-1.10.1-源码 Tensorflow-1.10.1-源码 Tensorflow-1.10.1-源码 Tensorflow-1.10.1-源码 Tensorflow-1.10.1-源码 Tensorflow-1.10.1-源码 Tensorflow-1.10.1-源码 Tensorflow-1.10.1-源码 Tensorflow-...
《jQuery UI 1.10.1:构建交互式网页的强大工具》 jQuery UI 是一个基于 jQuery JavaScript 库的开源项目,它提供了丰富的用户界面组件和交互效果,为开发者提供了构建功能丰富的、交互性强的网页应用的强大支持。...
《Apache Flink 1.10.1:流处理与批处理框架的深入解析》 Apache Flink 是一个开源的流处理和批处理框架,它以其高性能、低延迟以及对实时数据流处理的强大支持而备受关注。Flink 1.10.1 版本的发布,进一步提升了...