参数化规范
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]); } }
通过上面的例子,你可以看到参数化规范能给你带来更多额外的自由和灵活性。
出处:
责任编辑:bluehearts
上一页 php设计模式介绍之规范模式 [2] 下一页 php设计模式介绍之规范模式 [4]
◎进入论坛网络编程版块参加讨论
|