简单的订阅者模式

WBOY
リリース: 2016-06-06 19:37:45
オリジナル
1390 人が閲覧しました

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.
ログイン後にコピー
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート