Home  >  Article  >  php教程  >  简单的订阅者模式

简单的订阅者模式

WBOY
WBOYOriginal
2016-06-06 19:37:451356browse

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.
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn