Lynda 假设有一个系统服务,有几个模块需要使用服务,组件可以订阅这个服务或消息,通过系统广播通知所有的模块。 无 ?php// 订阅发布模式 接口的定义及消息的传递class Dispatcher{ // 监视public static $listeners = array();protected function __constru
Lynda
<?php // 订阅发布模式 接口的定义及消息的传递 class Dispatcher { // 监视 public static $listeners = array(); protected function __construct(){} // 订阅服务 public static function subscribe($object, $subscribe) { $id = spl_object_hash($object); self::$listeners[$id][] = $subscribe; } // 广播消息 public static function publish($object) { $id = spl_object_hash($object); foreach (self::$listeners[$id] as $subscriber) { //var_dump($subscriber); $subscriber->doSomething(); } } } class Service { protected $name = ''; public function __construct($name) { $this->name = $name; } // 触发动作 public function doSomething() { echo sprintf("%s has something happened.\n", $this->name); Dispatcher::publish($this); } } class Component { protected $name = ''; public function __construct($name) { $this->name = $name; } public function doSomething() { echo sprintf("%s did something.\n", $this->name); } } $serviceA = new Service("ServiceA"); $componentA = new Component("componentA"); $componentB = new Component("componentB"); $componentC = new Component("componentC"); Dispatcher::subscribe($serviceA, $componentA); Dispatcher::subscribe($serviceA, $componentB); Dispatcher::subscribe($serviceA, $componentC); // 触发一个动作 $serviceA->doSomething(); // output //ServiceA something happened. //componentA did something. //componentB did something. //componentC did something.