空對象模式不屬於 GoF 設計模式,可是它做爲一種常常出現的套路足以被視爲設計模式。它具備以下優勢:php
客戶端代碼簡單laravel
能夠減小報空指針異常的概率面試
測試用例不須要考慮太多條件sql
返回一個對象或 null 應該用返回對象或者 NullObject 代替。NullObject 簡化了死板的代碼,消除了客戶端代碼中的條件檢查,例如 if (!is_null($obj)) { $obj->callSomething(); } 只需 $obj->callSomething(); 就行。shell
Symfony2: 空日誌設計模式
Symfony2: Symfony/Console 空輸出服務器
命令行模式中的空命令架構
責任鏈模式中的空處理器併發
<?php namespace DesignPatterns\Behavioral\NullObject; /** * 建立服務類 Service 。 */ class Service { /** * @var LoggerInterface * 定義日記類對象。 */ private $logger; /** * @param LoggerInterface $logger * 傳入日記類對象參數。 */ public function __construct(LoggerInterface $logger) { $this->logger = $logger; } /** * 作些什麼。。。 * 在日記中返回了 '咱們在 Service: doSomething 裏' 。 */ public function doSomething() { // 提示:這裏你只是使用它,而不須要經過如:is_null() 檢查 $logger 是否已經設置。 $this->logger->log('We are in '.__METHOD__); } }
<?php namespace DesignPatterns\Behavioral\NullObject; /** * 重要特徵:空日記必須像其餘日記意向從這個接口繼承。 */ interface LoggerInterface { public function log(string $str); }
<?php namespace DesignPatterns\Behavioral\NullObject; /** * 建立一個日記打印類實現日記接口。 */ class PrintLogger implements LoggerInterface { public function log(string $str) { echo $str; } }
<?php namespace DesignPatterns\Behavioral\NullObject; /** * 建立一個空日記類實現日記接口。 */ class NullLogger implements LoggerInterface { public function log(string $str) { // 什麼也不用作 } }
<?php namespace DesignPatterns\Behavioral\NullObject\Tests; use DesignPatterns\Behavioral\NullObject\NullLogger; use DesignPatterns\Behavioral\NullObject\PrintLogger; use DesignPatterns\Behavioral\NullObject\Service; use PHPUnit\Framework\TestCase; /** * 建立測試單元 LoggerTest 。 */ class LoggerTest extends TestCase { /** * 測試 NullLogger 對象,聯繫上文能夠知道什麼也沒作。 */ public function testNullObject() { $service = new Service(new NullLogger()); $this->expectOutputString(''); $service->doSomething(); } /** * 測試 PrintLogger 對象,聯繫上文能夠知道在日記中寫入了 DesignPatterns\Behavioral\NullObject\Service::doSomething 。 */ public function testStandardLogger() { $service = new Service(new PrintLogger()); $this->expectOutputString('We are in DesignPatterns\Behavioral\NullObject\Service::doSomething'); $service->doSomething(); } }
PHP 互聯網架構師 50K 成長指南+行業問題解決總綱(持續更新)
面試10家公司,收穫9個offer,2020年PHP 面試問題
★若是喜歡個人文章,想與更多資深開發者一塊兒交流學習的話,獲取更多大廠面試相關技術諮詢和指導,歡迎加入咱們的羣啊,暗號:phpzh(君羊號碼856460874)。
內容不錯的話但願你們支持鼓勵下點個贊/喜歡,歡迎一塊兒來交流;另外若是有什麼問題 建議 想看的內容能夠在評論提出