Heim  >  Artikel  >  php教程  >  简单的订阅者模式

简单的订阅者模式

WBOY
WBOYOriginal
2016-06-06 19:37:451391Durchsuche

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.
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn