php7 空对象,PHP设计模式之空对象模式(Null Object)代码实例大全(26)

目的

空对象模式不属于 GoF 设计模式,但是它作为一种经常出现的套路足以被视为设计模式。它具有如下优点:

客户端代码简单

可以减少报空指针异常的几率

测试用例不需要考虑太多条件

返回一个对象或 null 应该用返回对象或者 NullObject 代替。NullObject 简化了死板的代码,消除了客户端代码中的条件检查,例如 if (!is_null($obj)) { $obj->callSomething(); } 只需 $obj->callSomething(); 就行。

例子

Symfony2: 空日志

Symfony2: Symfony/Console 空输出

命令行模式中的空命令

责任链模式中的空处理器

UML图

75e4eb9590ce16eda0c89f9ee235e5d9.png

代码

Service.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

namespace DesignPatterns\Behavioral\NullObject;

/**

* 重要特征:空日记必须像其他日记意向从这个接口继承。

*/

interface LoggerInterface

{

public function log(string $str);

}

PrintLogger.php

namespace DesignPatterns\Behavioral\NullObject;

/**

* 创建一个日记打印类实现日记接口。

*/

class PrintLogger implements LoggerInterface

{

public function log(string $str)

{

echo $str;

}

}

NullLogger.php

namespace DesignPatterns\Behavioral\NullObject;

/**

* 创建一个空日记类实现日记接口。

*/

class NullLogger implements LoggerInterface

{

public function log(string $str)

{

// 什么也不用做

}

}

测试

Tests/LoggerTest.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();

}

}

★如果喜欢我的文章,想与更多资深开发者一起交流学习的话,获取更多大厂面试相关技术咨询和指导,欢迎加入我们的群啊,暗号:phpzh(君羊号码856460874)。

1c327d64e887d9e7f03dc03a0da8f08e.png

内容不错的话希望大家支持鼓励下点个赞/喜欢,欢迎一起来交流;另外如果有什么问题 建议 想看的内容可以在评论提出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值