Null オブジェクト パターンは、GoF の書籍「デザイン パターン」で言及されている 23 の古典的なデザイン パターンの 1 つではありませんが、無視できないほど頻繁に現れるパターンです。このパターンには次の利点があります:
Null Object パターンでは、以前はオブジェクトまたは null を返していたメソッドが Object を返すようになりました。たとえば、オブジェクトを返すメソッドを呼び出す前に、次のように記述する必要があります。
if (!is_null($obj)) { $obj->callSomething(); }
これは、オブジェクトが空であっても、空のオブジェクトは返されるため、次のように返されたオブジェクトのメソッドを直接呼び出すことができます:
$obj->callSomething();
これにより、クライアント側のチェック コードが不要になります。
もちろん、この種の呼び出しを実現するための前提条件は、返されるオブジェクトと空のオブジェクトが同じインターフェイスを実装し、一貫したコード構造を持つ必要があることであることに気づいたかもしれません。
<?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);}
<?phpnamespace DesignPatterns\Behavioral\NullObject;/** * PrintLogger是用于打印Logger实体到标准输出的Logger */class PrintLogger implements LoggerInterface{ /** * @param string $str */ public function log($str) { echo $str; }}