那麼如何讓各家電腦知道自己的盟友被攻擊了呢?並且自動做出反應?
待解決的問題:一旦某個電腦被我們進攻,其他電腦就獲知,並且自動出兵救援。
思路:為電腦設置一些額外的觀察系統,由他們去通知其他電腦。
觀察者(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');
?>
途總結:觀察者模式可以將某個狀態的變化立即通知所有相關的對象,並調用對方的處理方法。
實現總結:需要一個觀察者類來處理變化,被觀察的對象需要實現通知所有觀察者的方法