>  기사  >  php教程  >  简单的订阅者模式

简单的订阅者模式

WBOY
WBOY원래의
2016-06-06 19:37:451357검색

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.
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.