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


Posted in PHP onMarch 30, 2020

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

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

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

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

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

观察者(Observer)模式示例:

<?php
  //抽象的结盟类
  abstract class abstractAlly 
  {
    //放置观察者的集合,这里以简单的数组来直观演示
    public $oberserverCollection;

    //增加观察者的方法,参数为观察者(也是玩家)的名称
    public function addOberserver($oberserverName)
    {
      //以元素的方式将观察者对象放入观察者的集合
      $this->oberserverCollection[] = new oberserver($oberserverName);
    }

    //将被攻击的电脑的名字通知各个观察者
    public function notify($beAttackedPlayerName)
    {
      //把观察者的集合循环
      foreach ($this->oberserverCollection as $oberserver)
      {
        //调用各个观察者的救援函数,参数为被攻击的电脑的名字,if用来排除被攻击的电脑的观察者
        if($oberserver->name != $beAttackedPlayerName) 
        {
          $oberserver->help($beAttackedPlayerName);  
        }
      }
    }

    abstract public function beAttacked($beAttackedPlayer);
  }

  //具体的结盟类
  class Ally extends abstractAlly 
  {
    //构造函数,将所有电脑玩家的名称的数组作为参数
    public function __construct($allPlayerName)
    {
      //把所有电脑玩家的数组循环
      foreach ($allPlayerName as $playerName)
      {
        //增加观察者,参数为各个电脑玩家的名称
        $this->addOberserver($playerName);
      }
    }

    //将被攻击的电脑的名字通知各个观察者
    public function beAttacked($beAttackedPlayerName)
    {
      //调用各个观察者的救援函数,参数为被攻击的电脑的名字,if用来排除被攻击的电脑的观察者
      $this->notify($beAttackedPlayerName);
    }
  }

  //观察者的接口
  interface Ioberserver 
  {
    //定义规范救援方法
    function help($beAttackedPlayer);
  }

  //具体的观察者类
  class oberserver implements Ioberserver 
  {
    //观察者(也是玩家)对象的名字
    public $name;

    //构造函数,参数为观察者(也是玩家)的名称
    public function __construct($name)
    {
      $this->name = $name;
    }

    //观察者进行救援的方法
    public help($beAttackedPlayerName)
    {
      //这里简单的输出,谁去救谁,最后加一个换行,便于显示
      echo $this->name." help ".$beAttackedPlayerName."<br>";
    }

    abstract public function beAttacked($beAttackedPlayer);
  }

  //假设我一对三,两家虫族,一家神族
  $allComputePlayer = array('Zerg1', 'Protoss2', 'Zerg2');

  //新建电脑结盟
  $Ally = new Ally($allComputePlayer);

  //假设我进攻了第二个虫族
  $Ally->beAttacked('Zerg2');

?>

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

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

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php adodb连接带密码access数据库实例,测试成功
May 14 PHP
php GD绘制24小时柱状图
Jun 28 PHP
国外PHP程序员的13个好习惯小结
Feb 20 PHP
关于Iframe如何跨域访问Cookie和Session的解决方法
Apr 15 PHP
php导入导出excel实例
Oct 25 PHP
PHP判断数据库中的记录是否存在的方法
Nov 14 PHP
php实现图片添加描边字和马赛克的方法
Dec 10 PHP
php获取twitter最新消息的方法
Apr 14 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
Mar 07 PHP
PHP使用Redis长连接的方法详解
Feb 12 PHP
详解PHP变量传值赋值和引用赋值变量销毁
Mar 23 PHP
thinkphp5实现微信扫码支付
Dec 23 PHP
TP5框架实现上传多张图片的方法分析
Mar 29 #PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 #PHP
php查看一个变量的占用内存的实例代码
Mar 29 #PHP
tp5框架前台无限极导航菜单类实现方法分析
Mar 29 #PHP
PHP中类与对象功能、用法实例解读
Mar 27 #PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
Mar 27 #PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
Mar 27 #PHP
You might like
php根据日期或时间戳获取星座信息和生肖等信息
2015/10/20 PHP
yii2中使用Active Record模式的方法
2016/01/09 PHP
php中__toString()方法用法示例
2016/12/07 PHP
laravel5.6 框架邮件队列database驱动简单demo示例
2020/01/26 PHP
jQuery Div中加载其他页面的实现代码
2009/02/27 Javascript
js有关元素内容操作小结
2011/12/20 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
网页右侧悬浮滚动在线qq客服代码示例
2014/04/28 Javascript
jQuery中$.extend()用法实例
2015/06/24 Javascript
jquery实现select下拉框美化特效代码分享
2015/08/18 Javascript
Jquery遍历select option和添加移除option的实现方法
2016/08/26 Javascript
xcode中获取js文件的路径方法(推荐)
2016/11/05 Javascript
jquery Easyui Datagrid实现批量操作(编辑,删除,添加)
2017/02/20 Javascript
jQuery使用正则验证15/18身份证的方法示例
2017/04/27 jQuery
Webpack打包css后z-index被重新计算的解决方法
2017/06/18 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
vue组件三大核心概念图文详解
2019/05/30 Javascript
解决layui表格内文本超出隐藏的问题
2019/09/12 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
python 安装virtualenv和virtualenvwrapper的方法
2017/01/13 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
2019/08/26 Python
python代码xml转txt实例
2020/03/10 Python
CSS3 实现弹幕的示例代码
2017/08/07 HTML / CSS
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
EJB的基本架构
2016/09/22 面试题
函授本科毕业自我鉴定
2013/10/09 职场文书
《三峡》教学反思
2014/03/01 职场文书
助残日活动总结
2014/08/27 职场文书
乡镇党的群众路线教育实践活动制度建设计划
2014/11/03 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书
《西游记》读后感(3篇)
2019/09/20 职场文书
英语版自我评价,35句话轻松搞定
2019/10/08 职场文书
python urllib库的使用详解
2021/04/13 Python