快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
后,表单渲染 出来如下图所示:

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

为建立统一的API,我们创建一个基本的组件类(如果这是php5的例子,这或许会使用接口) 。既然所有的组件(表单元素)都必须渲染一些输出,组建类可以仅仅只有一个paint()方法。

class Widget {
function paint() {
return $this->_asHtml();
}
}

让我们以一个基本的text输入组件开始。它(组件)必须要包含输入区域的 名字(name)而且输入内容可以以HTML的方式渲染。

class TextInput extends Widget {
var $name;
var $value;
function TextInput($name, $value=’’) {
$this->name = $name;
$this->value = $value;
}
function _asHtml () {
return ‘<input type=”text” name=”’.$this- >name.’” value=”’
.$this- >value.’”>’;
}
}

一个基本的测试可以验证HTML 代码是否正确——作为参数传入给构造函数的名字,值(内容)是否传递到渲染后的输出中 :

class WidgetTestCase extends UnitTestCase {
function testTextInput() {
$text =& new TextInput(‘foo’, ‘bar’);
$output = $text->paint();
$this->assertWantedPattern(
‘~^<input type=”text”[^>]*>$~i’, $output);
$this- >assertWantedPattern(‘~name=”foo”~i’, $output);
$this- >assertWantedPattern(‘~value=”bar”~i’, $output);
}
}

TextInput组件工作正常,但是它的用户接口非常糟糕,它缺少友好的描述,如 “First Name” 或者 “Email Address.” 。因此,下一个增加到组件类的合理 的特性就是一个描述。我们进入有能够统一增加(一些特性)能力的装饰器模式。

作为开始,我 们建立一个普通的可以被扩展产生具体的特定装饰器的WidgetDecorator类。至少WidgetDecorator类应 该能够在它的构造函数中接受一个组件,并复制公共方法paint()。

class WidgetDecorator {
var $widget;
The Decorator Pattern 207
function WidgetDecorator(&$widget) {
$this->widget =& $widget;
}
function paint() {
return $this->widget->paint();
}
}

为建立一个标 签(lable),需要传入lable的内容,以及原始的组件:

class Labeled extends WidgetDecorator {
var $label;
function Labeled($label, &$widget) {
$this->label = $label;
$this->WidgetDecorator($widget);
}
}

有标签的组件也需要复制paint()方法,并将标签信息增加到输出中:

class Labeled extends WidgetDecorator {
var $label;
function Labeled($label, &$widget) {
$this->label = $label;
$this- >WidgetDecorator($widget);
}
function paint() {
return ‘<b>’.$this->label.’:</b> ‘.$this->widget- >paint();
}
}

你可以用一个测试检验它:

class WidgetTestCase extends UnitTestCase {
function testLabeled() {
$text =& new Labeled(
‘Email’
,new TextInput(‘email’));
$output = $text->paint();
208 The Decorator Pattern
$this->assertWantedPattern (‘~^<b>Email:</b> <input~i’, $output);
}
}

我们已经看到TextInput和Labeled类的能力,你可以装配一个类整体来管理表单(form )。

FormHandler类有一个静态的build()方法从表单的各种元素创建一个部件的数组。

class FormHandlerTestCase extends UnitTestCa

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号