萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> php編程 >> php Observer觀察者模式之學習筆記

php Observer觀察者模式之學習筆記

當我們在星際中開地圖和幾家電腦作戰的時候,電腦的幾個玩家相當於結盟,一旦我們出兵進攻某一家電腦,其余的電腦會出兵救援。 那麼如何讓各家電腦知道自己的盟友被攻擊了呢?並且自動做出反應?

那麼如何讓各家電腦知道自己的盟友被攻擊了呢?並且自動做出反應?


待解決的問題:一旦某個電腦被我們進攻,其他電腦就獲知,並且自動出兵救援。


思路:為電腦設置一些額外的觀察系統,由他們去通知其他電腦。

 

觀察者(Observer)模式示例:

 代碼如下 復制代碼

<?php

//抽象的結盟類

abstractclassabstractAlly{

//放置觀察者的集合,這裡以簡單的數組來直觀演示

public$oberserverCollection;

//增加觀察者的方法,參數為觀察者(也是玩家)的名稱

publicfunctionaddOberserver($oberserverName)

{

以元素的方式將觀察者對象放入觀察者的集合

$this->oberserverCollection[]=newoberserver($oberserverName);

}

//將被攻擊的電腦的名字通知各個觀察者

publicfunctionnotify($beAttackedPlayerName)

{

//把觀察者的集合循環

foreach($this->oberserverCollectionas$oberserver)

{

//調用各個觀察者的救援函數,參數為被攻擊的電腦的名字,if用來排除被攻擊的電腦的觀察者

if($oberserver->name!=$beAttackedPlayerName)$oberserver->help($beAttackedPlayerName);

}

}

abstractpublicfunctionbeAttacked($beAttackedPlayer);

}

//具體的結盟類

classAllyextendsabstractAlly{

//構造函數,將所有電腦玩家的名稱的數組作為參數

publicfunction__construct($allPlayerName)

{

//把所有電腦玩家的數組循環

foreach($allPlayerNameas$playerName)

{

//增加觀察者,參數為各個電腦玩家的名稱

$this->addOberserver($playerName);

}

}

//將被攻擊的電腦的名字通知各個觀察者

publicfunctionbeAttacked($beAttackedPlayerName)

{

//調用各個觀察者的救援函數,參數為被攻擊的電腦的名字,if用來排除被攻擊的電腦的觀察者

$this->notify($beAttackedPlayerName);

}

}

//觀察者的接口

interfaceIoberserver{

//定義規范救援方法

functionhelp($beAttackedPlayer);

}

//具體的觀察者類

classoberserverimplementsIoberserver{

//觀察者(也是玩家)對象的名字

public$name;

//構造函數,參數為觀察者(也是玩家)的名稱

publicfunction__construct($name)

{

$this->name=$name;

}

//觀察者進行救援的方法

publichelp($beAttackedPlayerName)

{

//這裡簡單的輸出,誰去救誰,最後加一個換行,便於顯示

echo$this->name."help".$beAttackedPlayerName."<br>";

}

abstractpublicfunctionbeAttacked($beAttackedPlayer);

}

//假設我一對三,兩家蟲族,一家神族

$allComputePlayer=array('Zerg1','Protoss2','Zerg2');

//新建電腦結盟

$Ally=newAlly($allComputePlayer);

//假設我進攻了第二個蟲族

$Ally->beAttacked('Zerg2');

?>


途總結:觀察者模式可以將某個狀態的變化立即通知所有相關的對象,並調用對方的處理方法。


實現總結:需要一個觀察者類來處理變化,被觀察的對象需要實現通知所有觀察者的方法

copyright © 萬盛學電腦網 all rights reserved