PHP設計模式之-----觀察者模式

<?php
/*
 * 觀察者模式
 * 其實觀察者模式這是一種較爲容易去理解的一種模式吧,它是一種事件系統,意味着這一模式允許某個類觀察另一個類的狀態,當被觀察的類狀態發生改變的時候,觀察類可以收到通知並且做出相應的動作;觀察者模式爲您提供了避免組件之間緊密耦合的另一種方法 
 * */

// 部隊兵種的接口
interface Arms
{
	public function dispatched();
}

// 部隊上的總指揮部的接口
interface Subject
{
	public function register( Arms $arms );
	
	public function notify();
}

/**
 * Class Action
 *
 * @describe 定義一個司令部類 如果收到了偵察兵的消息就殲滅敵軍
 *
 * @author   nick
 *
 */
class Action implements Subject
{
	// 打這場戰咱們有多少部隊都告訴我 讓我統計一下
	public $_observers = array(); // hi 哥們 你來統計一下兵種
	
	public function register( Arms $observer )
	{
		$this->_observers[] = $observer;
	}
	
	public function notify()
	{
		foreach ( $this->_observers as $observer ) {
			$observer->dispatched();
		}
	}
}

//核導彈部隊
class NuclearMissileForce implements Arms
{
	public function dispatched()
	{
		echo '發射核導彈,正中目標!' . '<hr>';
	}
}

//戰鬥機部隊
class Jagdwaffe implements Arms
{
	public function dispatched()
	{
		echo '空中轟炸機部隊已經出動!' . '<hr>';
	}
}

//地面特種兵
class GroundSpecialForces implements Arms
{
	public function dispatched()
	{
		echo '地面特種部隊正在殲滅敵軍!' . '<hr>';
	}
}

/**
 * Class Sentry
 *
 * @describe 哨兵類 負責通知司令部
 *
 * @author   nick
 *
 */
class Sentry
{
	private $action;
	
	public function __construct()
	{
		$this->action = new Action();
	}
	
	// 統計部隊上報司令部
	public function ReportToHeadquarters()
	{
		$this->action->register(new NuclearMissileForce());
		$this->action->register(new Jagdwaffe());
		$this->action->register(new GroundSpecialForces());
	}
	
	// 發現敵軍 開始戰鬥
	public function notifyAction()
	{
		$this->ReportToHeadquarters();
		$this->action->notify();
	}
}

$obj = new Sentry();
$obj->notifyAction();

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章