组件库包含哪些特性?
容易创建表单元素
将表单元素以html方式输出
在每个元素上实现简单的验证
本例中
,我们创建一个包含姓
,名,邮件地址,输入项的表单
。所有的区域都是必须的,而且E-mail必须看起来是有效的E—mail地址
。用HTML语言表示,表单的代码象下面所示:
<formaction=”formpage.php”method=”post”>
<b>FirstName:</b><inputtype=”text”name=”fname”value=””><br>
<b>LastName:</b><inputtype=”text”name=”lname”value=””><br>
<b>Email:</b><inputtype=”text”name=”email”value=””><br>
<inputtype=”submit”value=”Submit”>
</form>
增加一些css样式后,表单渲染出来如下图所示:
为建立统一的API,我们创建一个基本的组件类(如果这是php5的例子,这或许会使用接口)。既然所有的组件(表单元素)都必须渲染一些输出,组建类可以仅仅只有一个paint()方法。
classWidget{
functionpaint(){
return$this->_asHtml();
}
}
让我们以一个基本的text输入组件开始。它(组件)必须要包含输入区域的名字(name)而且输入内容可以以HTML的方式渲染。
classTextInputextendsWidget{
var$name;
var$value;
functionTextInput($name,$value=’’){
$this->name=$name;
$this->value=$value;
}
function_asHtml(){
return‘<inputtype=”text”name=”’.$this->name.’”value=”’
.$this->value.’”>’;
}
}
一个基本的测试可以验证HTML代码是否正确——作为参数传入给构造函数的名字,值(内容)是否传递到渲染后的输出中:
classWidgetTestCaseextendsUnitTestCase{
functiontestTextInput(){
$text=&newTextInput(‘foo’,‘bar’);
$output=$text->paint();
$this->assertWantedPattern(
‘~^<inputtype=”text”[^>]*>$~i’,$output);
$this->assertWantedPattern(‘~name=”foo”~i’,$output);
$this->assertWantedPattern(‘~value=”bar”~i’,$output);
}
}
TextInput组件工作正常,但是它的用户接口非常糟糕,它缺少友好的描述,如“FirstName”或者“EmailAddress.”。因此,下一个增加到组件类的合理的特性就是一个描述。我们进入有能够统一增加(一些特性)能力的装饰器模式。