PHP設計模式之空對象模式(Null Object)代碼實例大全(25)

目的

空對象模式不屬於 GoF 設計模式,可是它做爲一種常常出現的套路足以被視爲設計模式。它具備以下優勢:php

  • 客戶端代碼簡單laravel

  • 能夠減小報空指針異常的概率面試

  • 測試用例不須要考慮太多條件sql

返回一個對象或 null 應該用返回對象或者 NullObject 代替。NullObject 簡化了死板的代碼,消除了客戶端代碼中的條件檢查,例如 if (!is_null($obj)) { $obj->callSomething(); } 只需 $obj->callSomething(); 就行。shell

例子

  • Symfony2: 空日誌設計模式

  • Symfony2: Symfony/Console 空輸出服務器

  • 命令行模式中的空命令架構

  • 責任鏈模式中的空處理器併發

UML圖

★官方PHP高級學習交流社羣「點擊」管理整理了一些資料,BAT等一線大廠進階知識體系備好(相關學習資料以及筆面試題)以及不限於:分佈式架構、高可擴展、高性能、高併發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階乾貨分佈式

代碼

  • Service.php
<?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__);
    }
}
  • LoggerInterface.php
<?php

namespace DesignPatterns\Behavioral\NullObject;

/**
 * 重要特徵:空日記必須像其餘日記意向從這個接口繼承。
 */
interface LoggerInterface
{
    public function log(string $str);
}
  • PrintLogger.php
<?php

namespace DesignPatterns\Behavioral\NullObject;

/**
 * 建立一個日記打印類實現日記接口。
 */
class PrintLogger implements LoggerInterface
{
    public function log(string $str)
    {
        echo $str;
    }
}
  • NullLogger.php
<?php

namespace DesignPatterns\Behavioral\NullObject;

/**
 * 建立一個空日記類實現日記接口。
 */
class NullLogger implements LoggerInterface
{
    public function log(string $str)
    {
        // 什麼也不用作
    }
}

測試

  • Tests/LoggerTest.php
<?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 互聯網架構師成長之路*「設計模式」終極指南

PHP 互聯網架構師 50K 成長指南+行業問題解決總綱(持續更新)

面試10家公司,收穫9個offer,2020年PHP 面試問題

★若是喜歡個人文章,想與更多資深開發者一塊兒交流學習的話,獲取更多大廠面試相關技術諮詢和指導,歡迎加入咱們的羣啊,暗號:phpzh(君羊號碼856460874)。

2020年最新PHP進階教程,全系列!

內容不錯的話但願你們支持鼓勵下點個贊/喜歡,歡迎一塊兒來交流;另外若是有什麼問題 建議 想看的內容能夠在評論提出

相關文章
相關標籤/搜索