快速业务通道

php设计模式介绍之装饰器模式

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22

若你从事过面向对象的php开发,即使很短的时间或者仅仅通过本书了解了一些,你会知道,你可以 通过继承改变或者增加一个类的功能,这是所有面向对象语言的一个基本特性。如果已经存在的一个php 类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类 —这建立在额外的代码上。

但是产生子类并不总是可能或是合适的。如果 你希望改变一 个已经初始化的对象的行为,你怎么办?或者,你希望继承许多类的行为,改怎么办?前一个,只能在于 运行时完成,后者显然时可能的,但是可能会导致产生大量的不同的类—可怕的事情。

问 题

你如何组织你的代码使其可以容易的添加基本的或者一些很少用到的 特性,而不是直接不额 外的代码写在你的类的内部?

解决方案

装饰器模式提供了改变子类的灵活方案。装饰器 模式允许你在不引起子类数量爆炸的情况下动态的修饰对象,添加特性。

当用于一组子类时,装 饰器模式更加有用。如果你拥有一族子类(从一个父类派生而来),你需要在与子类独立使用情况下添 加额外的特性,你可以使用装饰器模式,以避免代码重复和具体子类数量的增加。看看以下例子,你可 以更好的理解这种观点。考虑一个建立在组件概念上的“form”表单库,在那里你需要为每 一个你想要表现的表单控制类型建立一个类。这种类图可以如下所示:

Select and TextInput类是组件类的子类。假如你想要增加一个“labeled”带标签的组件—一个输入表单告诉 你要输入的内容。因为任何一个表单都可能需要被标记,你可能会象这样继承每一个具体的组件:

php设计模式介绍之装饰器模式

上面的 类图看起来并不怎么坏,下面让我们再增加一些特性。表单验证阶段,你希望能够指出一个表单控制是 否合法。你为非法控制使用的代码又一次继承其它组件,因此又需要产生大量的子类:

php设计模式介绍之装饰器模式

这个类看起来并不是 太坏,所以让我们增加一些新的功能。在结构有效性确认中你需要指出结构是否是有效的。你需要让你 检验有效性的代码也可以应用到其它部件,这样不用再更多的子类上进行有效性验证。

php设计模式介绍之装饰器模式

这里子类溢出并不是 唯一的问题。想一想那些重复的代码,你需要重新设计你的整个类层次。有没有更好的方法!确实,装 饰器模式是避免这种情况的好方法。

装饰器模式结构上类似与代理模式(参见第2章)。一个装 饰器对象保留有对对象的引用,而且忠实的重新建立被装饰对象的公共接口。装饰器也可以增加方法, 扩展被装饰对象的接口,任意重载方法,甚至可以在脚本执行期间有条件的重载方法。

为了探究 装饰器模式,让我们以前面讨论过的表单组件库为例,并且用装饰器模式而不是继承,实现 “lable”和“invalidation”两个特性。

样本代码:

组件库包含 哪些特性?

容易创建表单元素

将表单元素以html方式输出

在每个元素上实现简单 的验证

本例中,我们创建一个包含姓,名,邮件地址,输入项的表单。所有的区域都是必须的, 而且E-mail必须看起来是有效的E—mail地址。用HTML语言表示,表单的代码象下面所示:

<form action=”formpage.PHP” method=”post”>
<b>First Name:</b> <input type=”text” name=”fname” value=””><br>
<b>Last Name:</b> <input type=”text” name=”lname” value=””><br>
<b>Email:</b> <input type=”text” name=”email” value=””><br>
<input type=”submit” value=”Submit”>
</form>

增加一些css样式

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号