php 设计模式系列之 specification规格模式,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));}}
以上内容是帮客之家小编给大家分享的php 设计模式系列之 specification规格模式,希望本文分享能够帮助大家。
您可能感兴趣的文章:php设计模式 composite (组合模式)php设计模式 template (模板模式)php设计模式 command(命令模式)php设计模式 singleton(单例模式)php设计模式 observer(观察者模式)php设计模式 strategy(策略模式)php设计模式 interpreter(解释器模式)php设计模式 factory(工厂模式)php设计模式 facade(外观模式)php设计模式 delegation(委托模式)
http://www.bkjia.com/phpjc/1091112.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/1091112.htmltecharticlephp 设计模式系列之 specification规格模式,specification模式 1、模式定义 规格模式是组合模式的一种扩展,在框架性开发中使用较多(项目级开...