设计模式之观察者模式

先上代码:

 

<?php
function buy($user)
{
    echo "buy success\n";
    return true;
}

class User
{
    private $_observers = array();
 
    public function register($sub)
    { /*  注册观察者 */
        $this->_observers[] = $sub;
    }

    public function trigger()
    {  /*  外部统一访问    */
        if(!empty($this->_observers)){
            foreach($this->_observers as $observer){
                $observer->update();
            }
        }
    }
}
 
/**
 * 观察者要实现的接口
 */
interface Observerable{
    public function update();
}
 
class Sms implements Observerable{
    public function update(){
        echo "Sms notify\n";
    }
}

class Email implements Observerable {
    public function update() {
        echo 'Email notify';
    }
}


$u = new User();
$u->register(new Sms());
$u->register(new Email());
if (buy($u)) {
    $u->trigger();
}

  如果不把那两个sms和Email这连个类放进user中的话,如果sms不需要了。或者需要修改的话,那么就需要修改一些核心类user内的内容。因为Email和sms属于不同的功能,在不同的场合可能user中需要不同的类(sms或者是Email),如果写两个这样的user类的话,就太冗余了。这种模式中user类中的register方法,就好像一个入口,需要哪一种具体的方法(sms或者Email)时,只需要用这个方法,把不同的对象加入到user对象内就可以了,然后用这些加入进去的对象(sms或者Email)调用他们相关的方法

posted @ 2016-08-07 20:58  萝卜er  阅读(127)  评论(0编辑  收藏  举报