空对象模式

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

上一篇下一篇

猜你喜欢

热点阅读