空对象模式
2017-05-31 本文已影响17人
散装咖啡
interface Book {
// 判断Book对象是否为空对象(Null Object)
public function isNull();
// 展示Book对象的信息内容。
public function show();
}
//原有的ConcreteBook类修改后的代码(增加对Book接口的实现,实现isNull方法):
class ConcreteBook implements Book {
private $id;
private $name;
private $author;
// 构造函数
public function __construct($id, $name, $author) {
$this->id = $id;
$this->name = $name;
$this->author = $author;
}
public function show() {
echo "$this->id $this->name $this->author";
}
public function isNull(){
return false;
}
}
//新增的空对象类NullBook类的代码(继承Book类):
class NullBook implements Book {
public function isNull() {
return true;
}
public function show() {
echo "Sorry,未找到符合您输入的ID的图书信息,请确认您输入的不是非法值。";
}
}
//工厂类(BookFactory),返回对象从ConcreteBook改为Book,并当ID属于非法值或者不存在时,返回NullBook对象。
class BookFactory {
public $book;
public function getBook($id) {
switch ($id) {
case 1:
$this->book = new ConcreteBook($id, "设计模式", "GoF");
break;
case 2:
$this->book = new ConcreteBook($id, "被遗忘的设计模式", "Null Object Pattern");
break;
default:
$this->book = new NullBook();//创建一个NullBook对象
break;
}
return $this->book;
}
}
//客户端的代码为:
$bookFactory = new BookFactory();
$book = $bookFactory->getBook(1);
$book->show();
//此时,在执行一下Client,你会发现控制台输出为:Sorry,未找到符合您输入的ID的图书信息,请确认您输入的不是非法值。
//其实,虽然在客户端我们不进行检测也可以保证程序不报错,但是最好的方式,还是进行相应的检测,如下:
if ($book->isNull()) {
//这里由客户端定制提醒代码
echo "兄弟,你输入的ID不符合规范吧。";
exit;
}
$book->show();
Null Object Pattern,作为一种被遗忘的设计模式,却有着不能被遗忘的作用。
(1)它可以加强系统的稳固性,能有有效地防止空指针报错对整个系统的影响,使系统更加稳定。
(2)它能够实现对空对象情况的定制化的控制,能够掌握处理空对象的主动权。
(3)它并不依靠Client来保证整个系统的稳定运行。
(4)它通过isNull对==null的替换,显得更加优雅,更加易懂。
参考文章 http://m.2cto.com/kf/201504/388387.html