<?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'); ?> |