PHP设计模式 — 规格模式(specification)

Posted 网页设计轻松学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP设计模式 — 规格模式(specification)相关的知识,希望对你有一定的参考价值。

1、模式定义

规格模式(Specification)可以认为是组合模式的一种扩展。有时项目中某些条件决定了业务逻辑,这些条件就可以抽离出来以某种关系(与、或、非)进行组合,从而灵活地对业务逻辑进行定制。另外,在查询、过滤等应用场合中,通过预定义多个条件,然后使用这些条件的组合来处理查询或过滤,而不是使用逻辑判断语句来处理,可以简化整个实现逻辑。

这里的每个条件就是一个规格,多个规格/条件通过串联的方式以某种逻辑关系形成一个组合式的规格。

2、UML类图

PHP设计模式 — 规格模式(specification)

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); }}
PHP设计模式 — 规格模式(specification)

第七个小矮人

主演:Otto Waalkes / Mirco Nontschew / Boris Aljinovic

以上是关于PHP设计模式 — 规格模式(specification)的主要内容,如果未能解决你的问题,请参考以下文章

规格模式 Specification Pattern

规格模式 Specification Pattern

软件需求模式阅读笔记之五

2019年北航OO第三单元(JML规格任务)总结

第十五讲:桥接模式

《软件需求模式》精读阅读笔记一