快速业务通道

php设计模式介绍之规范模式

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-22
的规范工具集。

class FieldMatchSpecification {
protected $field;
protected $regex;
public function __construct($field, $regex) {
$this->field = $field;
$this->regex = $regex;
}
public function isSatisfiedBy ($datasource) {
return preg_match($this->regex, $datasource->get($this- >field));
}
}

在这个例子里,这个字段对应的值和PCRE表达式都在构造 的时候保存好了。然后方法isSatisfiedBy()从传递过来的数据源DataSource获取到这个字段,并且使用 preg_match()方法来比较它的值是否满足对应的正则表达式。

下面这个例子演示了如何为 FieldMatchSpecification字段匹配规范书写测试实例。

class SpecificationsTestCase extends UnitTestCase {
// ...
function TestFieldMatchSpecification() {
$valid_email = new FieldMatchSpecification(
‘email’,
‘/^[^\s@]+@[^\s.]+(?:\.[^\s.]+)+/’);
$this->assertTrue($valid_email->isSatisfiedBy($this->ds));
$name_ten_letters = new FieldMatchSpecification(
‘name’,
‘/^\w{10}$/’);
$this->assertFalse($name_ten_letters->isSatisfiedBy($this->ds));
}
}

上面例子中 的email正则要求“在@前是一串不包含空格、@的字符,在@后是两组或者两组以上不包含可个空格 或者句点的字符串,这些字符串之间由句点间隔着”。而变量$name_ten_letters规范要求输入的 值必须恰好是由10个字符组成。

注:正则表达式

有许多书籍单独开一章来讲解正则表达 式,甚至有些整本书都在讨论这个话题(译者注:作者是为了说明正则表达式的重要性和难度)。所以 ,请认识到上面的代码只是一个过于简单化的例子,而不是一个检查email的完善的正则表达式。

下面让我们搭建最后一个具体的规范用来检验一个字段值是否大于或者等于对应的值。我们毫无 疑问的把它命名为FieldGreaterThanOrEqualSpecification.。

class FieldGreaterThanOrEqualSpecification {
protected $field;
protected $value;
public function __construct($field, $value) {
$this->field = $field;
$this- >value = $value;
}
public function isSatisfiedBy($datasource) {
return ($datasource->get($this->field) >= $this->value);
}
}

这 里没有太多的不可思议的:在构造器里面存储相应的要被比较的字段和值,然后在方法isSatisfiedBy() 里面验证提取出来的字段。

下面是一个测试实例,用来演示如何应用 FieldGreaterThanOrEqualSpecification。

class SpecificationsTestCase extends UnitTestCase {
// ...
function TestFieldGreaterThanOrEqualSpecification() {
$adult =
new FieldGreaterThanOrEqualSpecification(‘age’, 18);
$presidential_age =
new FieldGreaterThanOrEqualSpecification(‘age’, 35);
$this->assertTrue($adult->isSatisfiedBy($this->ds));
$this- >assertFalse($presidential_age->isSatisfiedBy($this->ds));
}
}

你是否已经注意到在规范对象被标识上合理的名称时候,这些代码是如何开始证明自己 的吗?你是否能够通过规范对象的名称来理解到代码的相应的功能? $adult->isSatisfiedBy ($something)你看一眼就会明白,根本无需深入详细的钻研代码。这也是规范模式的优点之一吧。

到现在为止,你应该很清楚的明白规范模式就如一个接口。使用PHP5明确的表示出这个规范模式 :

interface Specification {
public function isSatisfiedBy ($datasource);
}

我们把这些基本的模块按照一定的格式集中起来,这甚至是

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