ホームページ >バックエンド開発 >PHPチュートリアル >PHP デザイン パターン シリーズ -- Null オブジェクト パターン

PHP デザイン パターン シリーズ -- Null オブジェクト パターン

WBOY
WBOYオリジナル
2016-06-23 13:19:53861ブラウズ

1. パターン定義

Null オブジェクト パターンは、GoF の書籍「デザイン パターン」で言及されている 23 の古典的なデザイン パターンの 1 つではありませんが、無視できないほど頻繁に現れるパターンです。このパターンには次の利点があります:

  • クライアント コードの簡素化
  • null ポインター例外のリスクの軽減
  • 条件付き制御ステートメントが減ってテスト ケースが削減される

Null Object パターンでは、以前はオブジェクトまたは null を返していたメソッドが Object を返すようになりました。たとえば、オブジェクトを返すメソッドを呼び出す前に、次のように記述する必要があります。

if (!is_null($obj)) {     $obj->callSomething(); }

これは、オブジェクトが空であっても、空のオブジェクトは返されるため、次のように返されたオブジェクトのメソッドを直接呼び出すことができます:

$obj->callSomething();

これにより、クライアント側のチェック コードが不要になります。

もちろん、この種の呼び出しを実現するための前提条件は、返されるオブジェクトと空のオブジェクトが同じインターフェイスを実装し、一貫したコード構造を持つ必要があることであることに気づいたかもしれません。

2. UML クラス図

3. サンプルコード

Service.php

LoggerInterface.php

<?phpnamespace DesignPatterns\Behavioral\NullObject;/** * Service 是使用 logger 的模拟服务 */class Service{    /**     * @var LoggerInterface     */    protected $logger;    /**     * 我们在构造函数中注入logger     *     * @param LoggerInterface $log     */    public function __construct(LoggerInterface $log)    {        $this->logger = $log;    }    /**     * do something ...     */    public function doSomething()    {        // 在空对象模式中不再需要这样判断 "if (!is_null($this->logger))..."        $this->logger->log('We are in ' . __METHOD__);        // something to do...    }}

PrintLogger.php

<?phpnamespace DesignPatterns\Behavioral\NullObject;/** * LoggerInterface 是 logger 接口 * * 核心特性: NullLogger必须和其它Logger一样实现这个接口 */interface LoggerInterface{    /**     * @param string $str     *     * @return mixed     */    public function log($str);}

NullLogger.php

<?phpnamespace DesignPatterns\Behavioral\NullObject;/** * PrintLogger是用于打印Logger实体到标准输出的Logger */class PrintLogger implements LoggerInterface{    /**     * @param string $str     */    public function log($str)    {        echo $str;    }}

4. テストコード

テスト/LoggerTest .php

rree

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。