观察者模式(Observer),当一个对象的状态发生改变时,依赖他的对象会全部收到通知,并自动更新。

理解:一个事件发生后,要执行一连串更新操作.传统的编程方式,就是在事件的代码之后直接加入处理逻辑,当更新得逻辑增多之后,代码会变得难以维护.这种方式是耦合的,侵入式的,增加新的逻辑需要改变事件主题的代码

场景:比如用户注册后需要增加一个邮件推送的功能,过几天加送优惠券的功能,这时将代码都写在登录里就非常的偶尔的,或者比如要根据用户不同的角色给出不同的处理方式(势利眼的观察者看人下菜),这些都可以使用观察者模式(如thinkphp6的事件)。

// 被观察者接口
interface Subject{
    public function register(Observer $observer);  //添加(注册)观察者对象
    public function detach(Observer $observer);    //删除观察者对象
    public function notify();                      //通知观察者执行相应功能
}
// 观察者接口
interface Observer{
    public function watch();   //观察者要执行的方法
}



// 被观察者继承类
class Action implements Subject{
 
     public $_observers=array(); //用于存储观察者对象
 
     //用于添加(注册)观察者对象
     public function register(Observer $observer){
         $this->_observers[]=$observer;
     }
 
     //用于删除观察者对象
     public function detach(Observer $observer){
 
        $index = array_search($observer, $this->_observers);
 
        if ($index === FALSE || ! array_key_exists($index, $this->_observers)) {
            return FALSE;
        }
 
        unset($this->_observers[$index]);
        return TRUE;
     }
 
     //通知各观察者
     public function notify(){
 
         //****重点,其实就是循环中执行各观察这对象的watch方法,不同功能方法内容不同但方法名相同
         foreach ($this->_observers as $observer) {
             $observer->watch();
         }
 
     }
 }
 
// cat观察者继承类
class Cat implements Observer{
     public function watch(){
         echo "Cat likes fish <hr/>";
     }
 } 
 
 //dog观察者继承类
 class Dog implements Observer{
     public function watch(){
         echo "Dog likes ball<hr/>";
     }
 } 
 //people观察者继承类
 class People implements Observer{
     public function watch(){
         echo "People likes mobile<hr/>";
     }
 }



// 应用实例
//创建一个事件
$action=new Action();
//为事件增加旁观者
$action->register(new Cat());
$action->register(new People());
$action->register(new Dog());
//执行事件 通知旁观者
$action->notify();
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.

观察者就是定义各种功能的对象,如给第一次登录的用户发红包,给用户最新的10条文章推送,给非vip用户推送10条需要注册才能打开的视频诱导用户开通vip,一个规则就是一个观察者,增加新规则就增加新观察者,被观察者对象要实现的就是 将添加(注册)的观察者对象存储起来并逐个通知执行观察者各自的功能