第4课:设计模式之观察者模式

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个功能对象。这个功能对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己

通俗的说,就像下属在等领导命令,领导一旦发出命令,下面负责对应项目的人赶紧去做

解决的问题
将一个系统分割成一些相互协作的类有一个不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维持一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不便。观察者就是解决这类的耦合关系的

实际应用:
最常用的莫过于在主体项目中增加功能模块或者说是插件,这些插件又和主体不可避免的有关联,这些插件就可以写成观察者进行解耦

下面给出一个例子:
<?php

class User {
    private $_observers = array();

    public function addCustomer($name) {
      foreach( $this->_observers as $obs )
        $obs->onChanged($this, $name);
    }

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

class UserLogger {
    public function onChanged($sender, $args) {
        echo "www.godeye.org";
    }
}

$u = new User();
$u->addObserver(new UserListLogger());
$u->addCustomer("Godeye");
?>
我们对代码进行分析,首先有一个User类,当用户表增加数据的时候,会通知UserLogger这个日志类记一条日志
也就是说,这两个类是耦合的,如果解耦?
在User类中的方法addObserver是关键,顾名思义,这个是增加"观察者"的方法
$u->addObserver(new UserListLogger());增加方式是这样的
也就是说当用户类初始化完成之后,把和他想关联的类都加入成为他的观察者,然后调用自己的方法,完成相应的功能,最后调用addCustomer,通知观察者根据约定好的规则,进行他们自己相应的处理