目次
" >
" > <?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... }}
ログイン後にコピー
<?phpnamespace DesignPatterns\Behavioral\NullObject;/** * LoggerInterface 是 logger 接口 * * 核心特性: NullLogger必须和其它Logger一样实现这个接口 */interface LoggerInterface{ /** * @param string $str * * @return mixed */ public function log($str);}
ログイン後にコピー
テスト/LoggerTest .php
rree " > <?phpnamespace DesignPatterns\Behavioral\NullObject;/** * PrintLogger是用于打印Logger实体到标准输出的Logger */class PrintLogger implements LoggerInterface{ /** * @param string $str */ public function log($str) { echo $str; }}
ログイン後にコピー 4. テストコード
テスト/LoggerTest .php rree
<?phpnamespace DesignPatterns\Behavioral\NullObject;/** * PrintLogger是用于打印Logger实体到标准输出的Logger */class PrintLogger implements LoggerInterface{ /** * @param string $str */ public function log($str) { echo $str; }}
ログイン後にコピー
PHP デザイン パターン シリーズ -- Null オブジェクト パターン
Jun 23, 2016 pm 01:19 PM
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;/** * 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... }}
ログイン後にコピー
<?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;/** * LoggerInterface 是 logger 接口 * * 核心特性: NullLogger必须和其它Logger一样实现这个接口 */interface LoggerInterface{ /** * @param string $str * * @return mixed */ public function log($str);}
ログイン後にコピー
<?phpnamespace DesignPatterns\Behavioral\NullObject;/** * PrintLogger是用于打印Logger实体到标准输出的Logger */class PrintLogger implements LoggerInterface{ /** * @param string $str */ public function log($str) { echo $str; }}
ログイン後にコピー 4. テストコード
テスト/LoggerTest .php rree
<?phpnamespace DesignPatterns\Behavioral\NullObject;/** * PrintLogger是用于打印Logger实体到标准输出的Logger */class PrintLogger implements LoggerInterface{ /** * @param string $str */ public function log($str) { echo $str; }}
ログイン後にコピー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

人気の記事
レポ:チームメイトを復活させる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
スプリットフィクションを打ち負かすのにどれくらい時間がかかりますか?
3週間前
By DDD
R.E.P.O.説明されたエネルギー結晶と彼らが何をするか(黄色のクリスタル)
1週間前
By 尊渡假赌尊渡假赌尊渡假赌
ハローキティアイランドアドベンチャー:巨大な種を手に入れる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌

人気の記事
レポ:チームメイトを復活させる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌
スプリットフィクションを打ち負かすのにどれくらい時間がかかりますか?
3週間前
By DDD
R.E.P.O.説明されたエネルギー結晶と彼らが何をするか(黄色のクリスタル)
1週間前
By 尊渡假赌尊渡假赌尊渡假赌
ハローキティアイランドアドベンチャー:巨大な種を手に入れる方法
3週間前
By 尊渡假赌尊渡假赌尊渡假赌

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック
Gmailメールのログイン入り口はどこですか?
7288
9


Java チュートリアル
1622
14


CakePHP チュートリアル
1342
46


Laravel チュートリアル
1259
25


PHP チュートリアル
1206
29



LaravelのバックエンドでReactアプリを構築する:パート2、React
