ホームページ  >  記事  >  バックエンド開発  >  デザインパターンPHPの例: オブザーバーパターン

デザインパターンPHPの例: オブザーバーパターン

WBOY
WBOYオリジナル
2016-06-20 12:30:40780ブラウズ

当一个对象状态发生改变后,会影响到其他几个对象的改变,这时候可以用观察者模式。像wordpress这样的应用程序中,它容外部开发组开发插件,比如用户授权的博客统计插件、积分插件,这时候可以应用观察者模式,先注册这些插件,当用户发布一篇博文后,就回自动通知相应的插件更新。观察者模式符合接口隔离原则,实现了对象之间的松散耦合。观察者模式UML图:在php SPL中已经提供SplSubject和SqlOberver接口[php] view plain copyinterface SplSubject  {      function attach(SplObserver $observer);      function detach(SplObserver $observer);      function notify();  }  interface SqlObserver  {      function update(SplSubject $subject);  }  下面具体实现上面例子[php] view plain copyclass Subject implements SplSubject  {      private $observers;        public function attach(SplObserver $observer)      {          if (!in_array($observer, $this->observers)) {              $this->observers[] = $observer;          }      }          public function detach(SplObserver $observer)      {          if (false != ($index = array_search($observer, $this->observers))) {              unset($this->observers[$index]);          }      }        public function post()      {          //post相关code          $this->notify();      }        private function notify()      {          foreach ($this->observers as $observer) {              $observer->update($this);          }      }        public function setCount($count)      {          echo "数据量加" . $count;      }      public function setIntegral($integral)      {           echo "积分量加" . $integral;      }    }      class Observer1 implements SplObserver  {      public function update($subject)      {          $subject-> setCount(1);      }  }  class Observer2 implements SplObserver  {      public function update($subject)      {          $subject-> setIntegral(10);      }  }      class Client  {      public  function test()      {          $subject = new Subject();          $subject->attach(new Observer1());          $subject->attach(new Observer2());          $subject->post();//输出:数据量加1 积分量加10      }  }

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。