一个设计模式的题目,编程

王洪旭 发布于 2014/07/09 17:19
阅读 447
收藏 3

说有三个对象,猫,老鼠,人,猫看见了老鼠,老鼠吓跑了,在过程中把人吵醒, 在编程过程中注意新的对象的参与。

不会,求解释

加载中
0
暗夜在火星
暗夜在火星
<?php

interface Subject
{
    function attach($observer);
    function detach($observer);
    function notify();
}

interface Observer
{
    function update($params = array());
}

class Cat implements Subject
{
    protected $_observers = array();

    public function attach($observer)
    {
        $this->_observers[] = $observer;
    }

    public function detach($observer)
    {
        //TODO
    }

    public function notify()
    {
        echo "我是一只猫,我看到了一只老鼠,所以我叫一声:~~~\n";

        foreach ($this->_observers as $observer) {
            $observer->update(array('voice' => '喵~~~'));
        }
    }
}

class Mouse implements Observer
{
    public function update($params = array())
    {
        $voice = $params['voice'];
        echo "我是老鼠,我听到了一声:“$voice ”,我得赶紧逃跑!\n";
    }
}

class Person implements Observer
{
    public function update($params = array())
    {
        $voice = $params['voice'];
        echo "我是一个人,正在睡觉时突然听到一声:“$voice ”,然后我就醒了。\n";
    }

}


class PHPUnderControll_Observer_Test extends PHPUnit_Framework_Testcase
{
    public function testObserver()
    {
        $cat = new Cat();

        $cat->attach(new Mouse());
        $cat->attach(new Person());

        $cat->notify();
    }

}



这里可以用观察者模式来实现,为了通俗表现题目场景,但又不失观察者模式的规范,这里结合了模式的通用写法和配合一些通俗的语句。通过一个场景故事来说明。

运行结果如下:

$phpunit ./cat_mouse_and_person.php 
PHPUnit 3.7.29 by Sebastian Bergmann.

.我是一只猫,我看到了一只老鼠,所以我叫一声:~~~
我是老鼠,我听到了一声:“喵~~~ ”,我得赶紧逃跑!
我是一个人,正在睡觉时突然听到一声:“喵~~~ ”,然后我就醒了。



也可以用其他语言或者其他模式来实现。主要是考虑需要解决的问题。

但这里明显应该使用行为型的设计模式,所以也可以考虑使用装饰者模式。简单的思路如下:

我是一只猫,然后我添加一个功能(吓跑老鼠),再添加一个功能(吵醒人),或者再添加一个功能(追赶老鼠)。。。

王洪旭
王洪旭
非常感谢
0
帖子列表
帖子列表

好深奥啊 坐等答案 

0
公孙二狗
公孙二狗

猫看见了老鼠,老鼠吓跑了

老鼠跑什么,它又没有看到猫

0
面码
面码
观察者..
返回顶部
顶部