WebjxCom提示:php教程:php设计模式介绍之装饰器模式.
装饰器的一个优点是你可以将他们串在一起(使用)
。Invalid装饰器仅仅知道:它正在包装一个组件:它不必关心组件是否是一个TextInput,Select,或者是一个有标签的被装饰版本的组件
。 这导致了下一个合理的测试用例:
classWidgetTestCaseextendsUnitTestCase{
//...
functiontestInvalidLabeled(){
$text=&newInvalid(
newLabeled(
‘Email’
,newTextInput(‘email’)));
$output=$text->paint();
$this->assertWantedPattern(‘~<b>Email:</b><input~i’,$output);
$this->assertWantedPattern(
‘~^<spanclass=”invalid”>.*</span>$~i’,$output);
}
}
有了Invalid装饰器
,我们来处理FormHandler::validate()方法:
classFormHandlerTestCaseextendsUnitTestCase{
//...
functiontestValidateMissingName(){
$post=&newPost;
$post->set(‘fname’,‘Jason’);
$post->set(‘email’,‘jsweat_php@yahoo.com’);
$form=FormHandler::build($post);
$this->assertFalse(FormHandler::validate($form,$post));
$this->assertNoUnwantedPattern(‘/invalid/i’,$form[0]->paint());
$this->assertWantedPattern(‘/invalid/i’,$form[1]->paint());
$this->assertNoUnwantedPattern(‘/invalid/i’,$form[2]->paint());
}
}
这个测试捕获(包含)了所有的基本方面:建立一个Post实例的存根
,使用它建立一个组件集合,然后将集合传送给validate方法。
classFormHandler{
functionvalidate(&$form,&$post){
//firstnamerequired
if(!strlen($post->get(‘fname’))){
$form[0]=&newInvalid($form[0]);
}
212TheDecoratorPattern
//lastnamerequired
if(!strlen($post->get(‘lname’))){
$form[1]=&newInvalid($form[1]);
}
}
}
不协调的代码
当我看这段代码时,我发现了两个不协调之处:通过数字索引访问表单元素,需要传递$_post数组。给validation方法。在以后的重构中,最好是创建一个组件集合用一个以表单元素名字索引的关联数组表示或者用一个Registry模式作为更合理的一步。你也可以给类Widget增加一个方法返回它的
当前数值,取消需要传递$_Post实例给Widget集合的构造函数。所有这些都超出了这个例子目的的范围。
为了验证目的,我们继续增加一个简单的正则方法(regex)来验证email地址:
classFormHandlerTestCaseextendsUnitTestCase{
//...
functiontestValidateBadEmail(){
$post=&newPost;
$post->set(‘fname’,‘Jason’);
$post->set(‘lname’,‘Sweat’);
$post->set(‘email’,‘jsweat_phpATyahooDOTcom’);
$form=FormHandler::build($post);
$this->assertFalse(FormHandler::validate($form,$post));
$this->assertNoUnwantedPattern(‘/invalid/i’,$form[0]->paint());
$this->assertNoUnwantedPattern(‘/invalid/i’,$form[1]->paint());
$this->assertWantedPattern(‘/invalid/i’,$form[2]->paint());
}
}
实现这个简单的email验证的代码如下:
classFormHandler{
functionvalidate(&$form,&$post){
//firstnamerequired
if(!strlen($post->get(‘fname’))){
$form[0]=&newInvalid($form[0]);
}
//lastnamerequired
if(!strlen($post->get(‘lname’))){
$form[1]=&newInvalid($form[1]);
}
//emailhastolookreal
if(!preg_match(‘~w+@(w+.)+w+~’
,$post->get(‘email’))){
$form[2]=&newInvalid($form[2]);
}
}
}