PHP 设计模式系列之 specification规格模式,specification模式_PHP教程
PHP 设计模式系列之 specification规格模式,specification模式
1、模式定义
规格模式是组合模式的一种扩展,在框架性开发中使用较多(项目级开发很少使用),这里做一个简单的介绍。
规格模式(Specification)可以认为是组合模式的一种扩展。有时项目中某些条件决定了业务逻辑,这些条件就可以抽离出来以某种关系(与、或、非)进行组合,从而灵活地对业务逻辑进行定制。另外,在查询、过滤等应用场合中,通过预定义多个条件,然后使用这些条件的组合来处理查询或过滤,而不是使用逻辑判断语句来处理,可以简化整个实现逻辑。
这里的每个条件就是一个规格,多个规格/条件通过串联的方式以某种逻辑关系形成一个组合式的规格。
2、UML类图
3、示例代码
Item.php
<?php namespace 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
<?php namespace 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
<?php namespace 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
<?php namespace 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); } }
Either.php
<?php namespace DesignPatterns\Behavioral\Specification; /** * 逻辑或规格 */ class Either 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); } }
Not.php
<?php namespace DesignPatterns\Behavioral\Specification; /** * 逻辑非规格 */ class Not extends AbstractSpecification { protected $spec; /** * 在构造函数中传入指定规格 * * @param SpecificationInterface $spec */ public function __construct(SpecificationInterface $spec) { $this->spec = $spec; } /** * 返回规格的相反结果 * * @param Item $item * * @return bool */ public function isSatisfiedBy(Item $item) { return !$this->spec->isSatisfiedBy($item); } }
PriceSpecification.php
<?php namespace DesignPatterns\Behavioral\Specification; /** * 判断给定Item的价格是否介于最小值和最大值之间的规格 */ class PriceSpecification extends AbstractSpecification { protected $maxPrice; protected $minPrice; /** * 设置最大值 * * @param int $maxPrice */ public function setMaxPrice($maxPrice) { $this->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() < $this->minPrice) { return false; } return true; } }
4、测试代码
Tests/SpecificationTest.php
<?php namespace DesignPatterns\Behavioral\Specification\Tests; use DesignPatterns\Behavioral\Specification\PriceSpecification; use DesignPatterns\Behavioral\Specification\Item; /** * SpecificationTest 用于测试规格模式 */ class SpecificationTest extends \PHPUnit_Framework_TestCase { public function testSimpleSpecification() { $item = new Item(100); $spec = new PriceSpecification(); $this->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(委托模式)

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Was bedeutet der „Bitte nicht stören“-Modus von WeChat? Mit der Popularität von Smartphones und der rasanten Entwicklung des mobilen Internets sind Social-Media-Plattformen zu einem unverzichtbaren Bestandteil des täglichen Lebens der Menschen geworden. WeChat ist eine der beliebtesten Social-Media-Plattformen in China und fast jeder hat ein WeChat-Konto. Über WeChat können wir in Echtzeit mit Freunden, Familie und Kollegen kommunizieren, Momente in unserem Leben teilen und die aktuelle Situation des anderen verstehen. Allerdings sind wir in dieser Zeit zwangsläufig auch mit den Problemen der Informationsüberflutung und des Verlusts der Privatsphäre konfrontiert, insbesondere für diejenigen, die sich konzentrieren müssen oder

iOS-Geräte können mit der Health-App seit langem Ihre Schlafmuster und mehr verfolgen. Aber ist es nicht ärgerlich, wenn Sie im Schlaf durch Benachrichtigungen gestört werden? Diese Benachrichtigungen sind möglicherweise irrelevant und stören daher Ihren Schlafrhythmus. Der „Bitte nicht stören“-Modus ist zwar eine gute Möglichkeit, Ablenkungen beim Schlafen zu vermeiden, kann jedoch dazu führen, dass Sie wichtige Anrufe und Nachrichten verpassen, die Sie nachts erhalten. Zum Glück kommt hier der Schlafmodus ins Spiel. Erfahren Sie mehr darüber und wie Sie es auf dem iPhone verwenden. Welche Rolle spielt der Schlafmodus auf dem iPhone? Der Schlafmodus ist ein dedizierter Fokusmodus in iOS, der automatisch basierend auf Ihrem Schlafplan in der „Health“-App aktiviert wird. Es hilft Ihnen, einen Alarm einzustellen und dann

Selbst das Beantworten von Anrufen im Modus „Bitte nicht stören“ kann ein sehr lästiges Erlebnis sein. Wie der Name schon sagt, deaktiviert der Modus „Bitte nicht stören“ alle Benachrichtigungen über eingehende Anrufe und Warnungen von E-Mails, Nachrichten usw. Sie können diesen Lösungssätzen folgen, um das Problem zu beheben. Fix 1 – Fokusmodus aktivieren Aktivieren Sie den Fokusmodus auf Ihrem Telefon. Schritt 1 – Wischen Sie von oben nach unten, um auf das Kontrollzentrum zuzugreifen. Schritt 2 – Aktivieren Sie als Nächstes den „Fokusmodus“ auf Ihrem Telefon. Der Fokusmodus aktiviert den „Bitte nicht stören“-Modus auf Ihrem Telefon. Es werden keine Benachrichtigungen über eingehende Anrufe auf Ihrem Telefon angezeigt. Fix 2 – Fokusmodus-Einstellungen ändern Wenn es Probleme mit den Fokusmoduseinstellungen gibt, sollten Sie diese beheben. Schritt 1 – Öffnen Sie Ihr iPhone-Einstellungsfenster. Schritt 2 – Als nächstes schalten Sie die Fokusmodus-Einstellungen ein

Das epc+o-Modell bezieht sich auf den allgemeinen Vertragsrahmen, der Design, Beschaffung usw. integriert. Es handelt sich um einige betriebliche Verknüpfungen, die von epc abgeleitet sind, d. h., während der Bauzeit muss der Generalunternehmer nicht nur Designaufgaben im herkömmlichen Sinne übernehmen Darüber hinaus muss es auch alle Wartungsarbeiten während der Betriebszeit übernehmen. Dieses Modell kann die betriebliche Effizienz vieler Projekte erheblich verbessern und die Betriebskosten schnell senken.

Windows im S-Modus soll mehr Sicherheit und Leistung bieten, indem nur die Installation von Apps aus dem Microsoft Store zugelassen wird. Während diese Funktion dazu beiträgt, Malware zu verhindern und eine sichere Computerumgebung zu gewährleisten, kann sie Benutzer einschränken, die Anwendungen aus anderen Quellen als dem Microsoft Store installieren möchten. Wenn Sie sich in dieser Situation befinden und sich ständig fragen, wie Sie in Windows 10/11 aus dem S-Modus wechseln können, dann sind Sie bei uns genau richtig, denn wir zeigen Ihnen, wie Sie mit zwei verschiedenen Methoden in Windows 10/11 wechseln können Die Schritte zum S-Modus stellen sicher, dass Sie die Freiheit genießen können, Apps von jedem beliebigen Ort aus zu installieren. Erfahren Sie, wie Sie in Windows aus dem S-Modus wechseln

Bei den Modellen iPhone 15 Pro und iPhone 15 Pro Max hat Apple eine physisch programmierbare Aktionstaste eingeführt, die den herkömmlichen Klingel-/Stummschalter über den Lautstärketasten ersetzt. Die Aktionstaste kann so programmiert werden, dass sie mehrere verschiedene Funktionen ausführt, aber die Möglichkeit, zwischen Stumm- und Klingelmodus zu wechseln, ist weiterhin vorhanden. Standardmäßig wird das Gerät durch langes Drücken der Aktionstaste stummgeschaltet und das taktile Feedback der Taste pulsiert dreimal. Bei beiden iPhone 15 Pro-Modellen wird neben der Uhrzeit in der Statusleiste ein durchgestrichenes Glockensymbol angezeigt, um anzuzeigen, dass der Lautlos-Modus aktiviert ist. Dies bleibt auch so, bis Sie die Aktionstaste erneut lange drücken, um die Stummschaltung des Geräts aufzuheben. Wenn Sie Ihr iPhone lieber in den lautlosen Modus versetzen möchten

Mit iOS17 kommt der Standby-Modus auf das iPhone. Diese Anleitung soll Ihnen zeigen, wie Sie diese Funktion auf Ihrem iPhone verwenden. Der Standby-Modus ist eine bahnbrechende Funktion, die das iPhone in ein dynamisches, immer eingeschaltetes Smart Display verwandelt. Wenn Ihr iPhone während des Ladevorgangs horizontal auf die Seite gelegt wird, aktiviert es den Standby-Modus. Dieser Modus präsentiert eine Vielzahl nützlicher Widgets, darunter unter anderem die aktuelle Uhrzeit, lokale Wetteraktualisierungen, eine Diashow Ihrer Lieblingsfotos und sogar Steuerelemente für die Musikwiedergabe. Ein wesentlicher Vorteil dieses Modus ist die Möglichkeit, Benachrichtigungen anzuzeigen, sodass Benutzer diese anzeigen und mit ihnen interagieren können, ohne ihr iPhone vollständig aufwecken zu müssen. So verwenden Sie den Standby-Modus Damit der Standby-Modus ordnungsgemäß funktioniert, muss auf Ihrem iPhone Folgendes ausgeführt werden: i

Notepad++ Dark Mode v8.0 hat keine Parameter, Notepad++ ist der nützlichste Texteditor. Jede unter Windows 10 ausgeführte App unterstützt den Dunkelmodus. Sie können Webbrowser wie Chrome, Firefox und Microsoft Edge benennen. Wenn Sie mit Notepad++ arbeiten, kann der standardmäßig weiße Hintergrund Ihre Augen schädigen. Entwickler haben Version 8 von Notepad++ den Dunkelmodus hinzugefügt. Hier erfahren Sie, wie Sie ihn aktivieren. Aktivieren Sie Notepad für Windows 11/10 ++. Dunkler Modus. Starten Sie Notepad ++. Klicken Sie auf „Einstellungen“ > „Einstellungen“ > „Dunkler Modus“. Wählen Sie „Dunkelmodus aktivieren“, um Notepad neu zu starten
