当前位置:首页 > PHP教程 > php面向对象 > 列表

php设计模式之观察者模式实例详解【星际争霸游戏案例】

发布:smiling 来源: PHP粉丝网  添加日期:2022-02-23 12:26:12 浏览: 评论:0 

本文实例讲述了php设计模式之观察者模式,分享给大家供大家参考,具体如下:

当我们在星际中开地图和几家电脑作战的时候,电脑的几个玩家相当于结盟,一旦我们出兵进攻某一家电脑,其余的电脑会出兵救援。

那么如何让各家电脑知道自己的盟友被攻击了呢?并且自动做出反应?

待解决的问题:一旦某个电脑被我们进攻,其他电脑就获知,并且自动出兵救援。

思路:为电脑设置一些额外的观察系统,由他们去通知其他电脑。

观察者(Observer)模式示例:

  1. <?php 
  2.   //抽象的结盟类 
  3.   abstract class abstractAlly  
  4.   { 
  5.     //放置观察者的集合,这里以简单的数组来直观演示 
  6.     public $oberserverCollection
  7.  
  8.     //增加观察者的方法,参数为观察者(也是玩家)的名称 
  9.     public function addOberserver($oberserverName
  10.     { 
  11.       //以元素的方式将观察者对象放入观察者的集合 
  12.       $this->oberserverCollection[] = new oberserver($oberserverName); 
  13.     } 
  14.  
  15.     //将被攻击的电脑的名字通知各个观察者 
  16.     public function notify($beAttackedPlayerName
  17.     { 
  18.       //把观察者的集合循环 
  19.       foreach ($this->oberserverCollection as $oberserver
  20.       { 
  21.         //调用各个观察者的救援函数,参数为被攻击的电脑的名字,if用来排除被攻击的电脑的观察者 
  22.         if($oberserver->name != $beAttackedPlayerName)  
  23.         { 
  24.           $oberserver->help($beAttackedPlayerName);   
  25.         } 
  26.       } 
  27.     } 
  28.  
  29.     abstract public function beAttacked($beAttackedPlayer); 
  30.   } 
  31.  
  32.   //具体的结盟类 
  33.   class Ally extends abstractAlly  
  34.   { 
  35.     //构造函数,将所有电脑玩家的名称的数组作为参数 
  36.     public function __construct($allPlayerName
  37.     { 
  38.       //把所有电脑玩家的数组循环 
  39.       foreach ($allPlayerName as $playerName
  40.       { 
  41.         //增加观察者,参数为各个电脑玩家的名称 
  42.         $this->addOberserver($playerName); 
  43.       } 
  44.     } 
  45.  
  46.     //将被攻击的电脑的名字通知各个观察者 
  47.     public function beAttacked($beAttackedPlayerName
  48.     { 
  49.       //调用各个观察者的救援函数,参数为被攻击的电脑的名字,if用来排除被攻击的电脑的观察者 
  50.       $this->notify($beAttackedPlayerName); 
  51.     } 
  52.   } 
  53.  
  54.   //观察者的接口 
  55.   interface Ioberserver  
  56.   { 
  57.     //定义规范救援方法 
  58.     function help($beAttackedPlayer); 
  59.   } 
  60.  
  61.   //具体的观察者类 
  62.   class oberserver implements Ioberserver  
  63.   { 
  64.     //观察者(也是玩家)对象的名字 
  65.     public $name
  66.  
  67.     //构造函数,参数为观察者(也是玩家)的名称 
  68.     public function __construct($name
  69.     { 
  70.       $this->name = $name
  71.     } 
  72.  
  73.     //观察者进行救援的方法 
  74.     public help($beAttackedPlayerName
  75.     { 
  76.       //这里简单的输出,谁去救谁,最后加一个换行,便于显示 
  77.       echo $this->name." help ".$beAttackedPlayerName."<br>"
  78.     } 
  79.  
  80.     abstract public function beAttacked($beAttackedPlayer); 
  81.   } 
  82.  
  83.   //假设我一对三,两家虫族,一家神族 
  84.   $allComputePlayer = array('Zerg1''Protoss2''Zerg2'); 
  85.  
  86.   //新建电脑结盟 
  87.   $Ally = new Ally($allComputePlayer); 
  88.  
  89.   //假设我进攻了第二个虫族 
  90.   $Ally->beAttacked('Zerg2'); 
  91.  
  92. ?> 

用途总结:观察者模式可以将某个状态的变化立即通知所有相关的对象,并调用对方的处理方法。

实现总结:需要一个观察者类来处理变化,被观察的对象需要实现通知所有观察者的方法。

Tags: php观察者模式 php星际争霸游戏

分享到: