您好,欢迎访问一九零五行业门户网

PHP 设计模式系列 -- 规格模式(Specification)

1、模式定义 规格模式(specification)可以认为是组合模式的一种扩展。有时项目中某些条件决定了业务逻辑,这些条件就可以抽离出来以某种关系(与、或、非)进行组合,从而灵活地对业务逻辑进行定制。另外,在查询、过滤等应用场合中,通过预定义多个条件,然后使用这些条件的组合来处理查询或过滤,而不是使用逻辑判断语句来处理,可以简化整个实现逻辑。
这里的每个条件就是一个规格,多个规格/条件通过串联的方式以某种逻辑关系形成一个组合式的规格。
2、uml类图
3、示例代码 item.php price = $price; } /** * get the items price * * @return int */ public function getprice() { return $this->price; }}
specificationinterface.php left->issatisfiedby($item) && $this->right->issatisfiedby($item); }}
either.php left = $left; $this->right = $right; } /** * 返回两种规格的逻辑或评估 * * @param item $item * * @return bool */ public function issatisfiedby(item $item) { return $this->left->issatisfiedby($item) || $this->right->issatisfiedby($item); }}
not.php spec = $spec; } /** * 返回规格的相反结果 * * @param item $item * * @return bool */ public function issatisfiedby(item $item) { return !$this->spec->issatisfiedby($item); }}
pricespecification.php maxprice = $maxprice; } /** * 设置最小值 * * @param int $minprice */ public function setminprice($minprice) { $this->minprice = $minprice; } /** * 判断给定item的定价是否在最小值和最大值之间 * * @param item $item * * @return bool */ public function issatisfiedby(item $item) { if (!empty($this->maxprice) && $item->getprice() > $this->maxprice) { return false; } if (!empty($this->minprice) && $item->getprice() minprice) { return false; } return true; }}
4、测试代码 tests/specificationtest.php asserttrue($spec->issatisfiedby($item)); $spec->setmaxprice(50); $this->assertfalse($spec->issatisfiedby($item)); $spec->setmaxprice(150); $this->asserttrue($spec->issatisfiedby($item)); $spec->setminprice(101); $this->assertfalse($spec->issatisfiedby($item)); $spec->setminprice(100); $this->asserttrue($spec->issatisfiedby($item)); } public function testnotspecification() { $item = new item(100); $spec = new pricespecification(); $not = $spec->not(); $this->assertfalse($not->issatisfiedby($item)); $spec->setmaxprice(50); $this->asserttrue($not->issatisfiedby($item)); $spec->setmaxprice(150); $this->assertfalse($not->issatisfiedby($item)); $spec->setminprice(101); $this->asserttrue($not->issatisfiedby($item)); $spec->setminprice(100); $this->assertfalse($not->issatisfiedby($item)); } public function testplusspecification() { $spec1 = new pricespecification(); $spec2 = new pricespecification(); $plus = $spec1->plus($spec2); $item = new item(100); $this->asserttrue($plus->issatisfiedby($item)); $spec1->setmaxprice(150); $spec2->setminprice(50); $this->asserttrue($plus->issatisfiedby($item)); $spec1->setmaxprice(150); $spec2->setminprice(101); $this->assertfalse($plus->issatisfiedby($item)); $spec1->setmaxprice(99); $spec2->setminprice(50); $this->assertfalse($plus->issatisfiedby($item)); } public function testeitherspecification() { $spec1 = new pricespecification(); $spec2 = new pricespecification(); $either = $spec1->either($spec2); $item = new item(100); $this->asserttrue($either->issatisfiedby($item)); $spec1->setmaxprice(150); $spec2->setmaxprice(150); $this->asserttrue($either->issatisfiedby($item)); $spec1->setmaxprice(150); $spec2->setmaxprice(0); $this->asserttrue($either->issatisfiedby($item)); $spec1->setmaxprice(0); $spec2->setmaxprice(150); $this->asserttrue($either->issatisfiedby($item)); $spec1->setmaxprice(99); $spec2->setmaxprice(99); $this->assertfalse($either->issatisfiedby($item)); }}
其它类似信息

推荐信息