lid extends WidgetDecorator {
function paint() {
return ‘<span class=”invalid”>’.$this->widget->paint ().’</span>’;
}
}
装饰器的一个优点是你可以将他们串 在一起(使用)。Invalid装饰器仅仅知道:它正在包装一个组件:它不必关心组件是否是一个 TextInput, Select,或者是一个有标签的被装饰版本的组件 。
这导致了下一个合理的测试用例 :
class WidgetTestCase extends UnitTestCase {
// ...
function testInvalidLabeled() {
$text =& new Invalid(
new Labeled(
‘Email’
,new TextInput(‘email’)));
$output = $text- >paint();
$this->assertWantedPattern(‘~<b>Email:</b> <input~i’, $output);
$this->assertWantedPattern(
‘~^<span class=”invalid”>.*</span>$~i’, $output);
}
}
有了Invalid装饰器,我们来处理FormHandler::validate() 方法:
class FormHandlerTestCase extends UnitTestCase {
// ...
function testValidateMissingName() {
$post =& new Post;
$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方法。
class FormHandler {
function validate(&$form, &$post) {
// first name required
if (!strlen($post- >get(‘fname’))) {
$form[0] =& new Invalid($form[0]);
}
212 The Decorator Pattern
// last name required
if (!strlen($post->get (‘lname’))) {
$form[1] =& new Invalid($form[1]);
}
}
}
不协调的代码
当我看这段代码时,我发现了两个不协调之处:通过数字索引访问 表单元素,需要传递
php设计模式介绍之装饰器模式 - 凌众科技
快速业务通道
++++选择通道++++
国内服务器 厦门电信服务器 汕头电信服务器 温州电信服务器 厦门网通服务器 汕头双线服务器 美国服务器 欧洲服务器 美国KT机房服务器 美国FDC机房服务器 香港服务器 新加坡服务器 韩国服务器 台湾服务器 英国服务器 德国服务器 新加坡Qala机房服务器 香港机房服务器 法国服务器 江苏电信服务器 美国TB机房服务器 日本服务器 河北网通服务器 厦门软二服务器 台湾机房服务器 韩国机房服务器 美国ST机房服务器 江西电信服务器 其他机房服务器 菲律宾服务器 日本机房服务器 菲律宾机房服务器
国内大带宽
php设计模式介绍之装饰器模式
作者 佚名技术
来源 NET编程
浏览
发布时间 2012-05-22
content
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn
为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
post数组。给validation方法。在以后的重构中,最好是创建一个组件集合用一 个以表单元素名字索引的关联数组表示或者用一个ReGIStry模式作为更合理的一步。你也可以给类 Widget增加一个方法返回它的
当前数值,取消需要传递
php设计模式介绍之装饰器模式 - 凌众科技
快速业务通道
++++选择通道++++
国内服务器 厦门电信服务器 汕头电信服务器 温州电信服务器 厦门网通服务器 汕头双线服务器 美国服务器 欧洲服务器 美国KT机房服务器 美国FDC机房服务器 香港服务器 新加坡服务器 韩国服务器 台湾服务器 英国服务器 德国服务器 新加坡Qala机房服务器 香港机房服务器 法国服务器 江苏电信服务器 美国TB机房服务器 日本服务器 河北网通服务器 厦门软二服务器 台湾机房服务器 韩国机房服务器 美国ST机房服务器 江西电信服务器 其他机房服务器 菲律宾服务器 日本机房服务器 菲律宾机房服务器
国内大带宽
php设计模式介绍之装饰器模式
作者 佚名技术
来源 NET编程
浏览
发布时间 2012-05-22
content
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn
为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
Post实例给Widget集合的构造函数。所 有这些都超出了这个例子目的的范围。
为了验证目的,我们继续增加一个简单的 正则方法 (regex)来验证email地址:
class FormHandlerTestCase extends UnitTestCase {
// ...
function testValidateBadEmail() {
$post =& new Post;
$post- >set(‘fname’, ‘Jason’);
$post->set(‘lname’, ‘Sweat’);
$post->set(‘email’, ‘jsweat_PHP AT yahoo DOT com’);
$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());
}