PHP设计模式 — 规格模式(specification)
Posted 网页设计轻松学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP设计模式 — 规格模式(specification)相关的知识,希望对你有一定的参考价值。
1、模式定义
规格模式(Specification)可以认为是组合模式的一种扩展。有时项目中某些条件决定了业务逻辑,这些条件就可以抽离出来以某种关系(与、或、非)进行组合,从而灵活地对业务逻辑进行定制。另外,在查询、过滤等应用场合中,通过预定义多个条件,然后使用这些条件的组合来处理查询或过滤,而不是使用逻辑判断语句来处理,可以简化整个实现逻辑。
这里的每个条件就是一个规格,多个规格/条件通过串联的方式以某种逻辑关系形成一个组合式的规格。
2、UML类图
3、示例代码
Item.php
<?phpnamespace DesignPatterns\Behavioral\Specification;class Item{ protected $price; /**
* An item must have a price *
* @param int $price */ public function __construct($price) { $this->price = $price; } /** * Get the items price *
* @return int */ public function getPrice() { return $this->price; }}
SpecificationInterface.php
<?phpnamespace DesignPatterns\Behavioral\Specification;
/** * 规格接口 */interface SpecificationInterface{ /**
* 判断对象是否满足规格 *
* @param Item $item *
* @return bool
*/ public function isSatisfiedBy(Item $item); /**
* 创建一个逻辑与规格(AND)
*
* @param SpecificationInterface $spec
*/ public function plus(SpecificationInterface $spec); /**
* 创建一个逻辑或规格(OR)
*
* @param SpecificationInterface $spec
*/ public function either(SpecificationInterface $spec); /**
* 创建一个逻辑非规格(NOT)
*/ public function not();}
AbstractSpecification.php
<?ph
pnamespace DesignPatterns\Behavioral\Specification;
/**
* 规格抽象类
*/
abstract class AbstractSpecification implements SpecificationInterface{ /**
* 检查给定Item是否满足所有规则
* * @param Item $item
* * @return bool
*/ abstract public function isSatisfiedBy(Item $item); /**
* 创建一个新的逻辑与规格(AND)
* * @param SpecificationInterface $spec
* * @return SpecificationInterface
*/ public function plus(SpecificationInterface $spec) { return new Plus($this, $spec); } /**
* 创建一个新的逻辑或组合规格(OR)
* * @param SpecificationInterface $spec
* * @return SpecificationInterface
*/ public function either(SpecificationInterface $spec) { return new Either($this, $spec); } /**
* 创建一个新的逻辑非规格(NOT)
* * @return SpecificationInterface
*/ public function not() { return new Not($this); }}
Plus.php
<?phpnamespace DesignPatterns\Behavioral\Specification;
/** * 逻辑与规格(AND) */
class Plus extends AbstractSpecification{ protected $left; protected $right; /**
* 在构造函数中传入两种规格
* * @param SpecificationInterface $left
* @param SpecificationInterface $right
*/ public function __construct(SpecificationInterface $left,
SpecificationInterface $right) { $this->left = $left; $this->right = $right; } /**
* 返回两种规格的逻辑与评估
* * @param Item $item
* * @return bool
*/ public function isSatisfiedBy(Item $item) { return $this->left->isSatisfiedBy($item) && $this->right->isSatisfiedBy($item); }}
第七个小矮人
主演:Otto Waalkes / Mirco Nontschew / Boris Aljinovic
以上是关于PHP设计模式 — 规格模式(specification)的主要内容,如果未能解决你的问题,请参考以下文章