美文网首页
空对象模式

空对象模式

作者: 散装咖啡 | 来源:发表于2017-05-31 00:49 被阅读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

    相关文章

      网友评论

          本文标题:空对象模式

          本文链接:https://www.haomeiwen.com/subject/uvddfxtx.html