《PHP设计模式介绍》第十章 规范模式(2)_PHP教程

编辑Tag赚U币
教程Tag:暂无Tag,欢迎添加,赚取U币!

推荐:《PHP设计模式介绍》第九章 观测模式
一些面向对象的编程方式,提供了一种构建对象间复杂网络互连的能力。当对象们连接在一起时,它们就可以相互提供服务和信息。 通常来说,当某个对象的状态发生改变时,你仍然需要对象之间能互

参数化规范

Trip Required Temperature Specification必须很熟悉Trip对象的结构,并且钻研Trip对象的三个public(公开)属性。这并不是很糟糕的。事实上,在过去使用规范模式的过程中,我发现不少规范得益于我对特有参数对象的详细了解。然而,这种紧密的联系对规范的重用带来了很大的麻烦。

幸运的是,各种不同的规范模式已经开始着手从事代码重用问题的研究。特别值得提出的是,参数化规范模式通过构造器(constructor)来接收参数,这个参数主要用于确定isSatisfiedBy()函数的进化标准。

现在让我们看看这个参数化规范,它使用了相同旅行站点的对象。假定你要搜索出一个目的地的列表,并且列表显示出满足“足够温暖”标准的城市。

使用原来的Trip Required Temperature Specification,你不得不为每个评估创建一个Trip对象。这是因为(在这个明确的问题上)旅行者(Traveler)和旅行日期(Date)是不变的,仅仅只有目的地因为你不断的重述可行目的地列表而不断变化。

使用参数化规范,你记住了旅行者首选的温度和旅行日期,并且你只要通过传递一个变量到方法isSatisfiedBy()就可以比较目的地。

参数化规范对象Destination Required Temperature Specification的构造函数需要一个旅行者(Traveler)和一个日期(Date)来实例化这个规范。

class DestinationRequiredTemperatureSpecification {
protected $temp;
protected $month;
public function __construct($traveler, $date) {
$this->temp = $traveler->min_temp;
$this->month = date(‘m’, $date);
}
}

由于存储在实例化变量中的数据(温度和日期)的一致性,Destination Required Temperature Specification的方法isSatisfiedBy()把目的地(Destination)做为一个输入参数来评估。

class DestinationRequiredTemperatureSpecification {
// ...
function isSatisfiedBy($destination) {
return
($destination->getAvgTempByMonth($this->month) >= $this->temp);
}
}

现在你可以写一个测试实例来过滤目的地列表。

class DestinationSpecificationTestCase extends UnitTestCase {
// similar setup to TripSpecificationTestCase
function TestFindingDestinations() {
$this->assertEqual(2, count($this->destinations));
$valid_destinations = array();
$vicki = new Traveler;
$vicki->min_temp = 70;
$travel_date = mktime(0,0,0,2,11,2005);
$warm_enough = new DestinationRequiredTemperatureSpecification(
vicki, $travel_date);
foreach($this->destinations as $dest) {
if ($warm_enough->isSatisfiedBy($dest)) {
$valid_destinations[] = $dest;
}
}
$this->assertEqual(1, count($valid_destinations));
$this->assertIdentical(
$this->destinations[‘Cancun’],
$valid_destinations[0]);
}
}

通过上面的例子,你可以看到参数化规范能给你带来更多额外的自由和灵活性。

现在让我们看看另外一个例子,在这个例子里面数据类型和规范都必须是非常的灵活易变的。

在web应用程序中,最常用也最让人发狂的一个问题就是确认表单输入(对表单输入数据的验证)。在软件开发过程中(甚至在开发过程外),表单是经常改变得,而且在大型的或者功能丰富的应用程序里面,表单的数量能够很快的增长。你可以创建一个唯一的对象来封装每一个表单,然后使用规范模式来确认每一个对象,但这绝对是一个持续的恶梦。

有没有一个方便的数据类型能够很容易的适应任何一个表单吗?如果有,那么有没有一个能够确认动态数据类型的方式呢?

上面每一个问题的答案显然是肯定的。

WEB应用程序组件工具箱(简称WACT)的数据源(DataSource)接口能够get(获取),set(设置),,并且动态的创建对象属性(有点类似PHP4的_GET()和_SET()方法),这些对象属性就是表单的封装操作手柄。(熟悉JAVA的读者可以把一个数据源(DataSource)理解未JAVA中的哈希图(HashMap))同时,参数化规范模式提供了一个模型以一定的标准来验证一个数据源。

注:WACT

WACT,WEB应用程序组件工具箱,能够在SourceForge(http://wact.sf.net)上下载到。它是一个PHP库类,用来解决在WEB应用程序开发中一些常用的问题。WACT很注重代码重用、单体测试和使用设计模式方面的技术。WACT理论相关的信息位于http://wact.sf.net/index.php/datasource

WACT数据源(DataSource)类包含在这本书的源代码里面,这样你可以方便的测试这些代码。

在这个例子中,数据源(DataSource)类可以被认为如下面的代码所示,它几乎和第5章开发的Register(注册)类完全一样。

class DataSource {
protected $store = array();
function get($key) {
if (array_key_exists($key, $this->store))
return $this->store[$key];
}
function set($key, $val) {
$this->store[$key] = $val;
}
}

数据源(DataSource)直接通过一串标识符来获取一个对象的属性。方法Set()用来改变原有的属性或者动态的创建新的属性,方法get()则能返回指定名称的属性。

分享:《PHP设计模式介绍》第八章 迭代器模式
类中的面向对象编程封装应用逻辑。类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态。单独的对象是一种组织代码的有用方法,但通常你会处理一组对象或者集合。 属性来自 SQL 查

来源:模板无忧//所属分类:PHP教程/更新时间:2008-08-22
相关PHP教程