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注销代码(session注销)
May 31 PHP
PHP中设置一个严格30分钟过期Session面试题的4种答案
Jul 30 PHP
php随机生成数字字母组合的方法
Mar 18 PHP
浅谈本地WAMP环境的搭建
May 13 PHP
PHP中list方法用法示例
Dec 01 PHP
Python中使用django form表单验证的方法
Jan 16 PHP
PHP多线程模拟实现秒杀抢单
Feb 07 PHP
PHP+JS实现的实时搜索提示功能
Mar 13 PHP
PHPExcel实现表格导出功能示例【带有多个工作sheet】
Jun 13 PHP
php微信开发之谷歌测距
Jun 14 PHP
php如何比较两个浮点数是否相等详解
Feb 12 PHP
PHP常用工具函数小结【移除XSS攻击、UTF8与GBK编码转换等】
Apr 27 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 使用MySQL管理Session的回调函数详解
2013/06/21 PHP
thinkphp配置连接数据库技巧
2014/12/02 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能
2017/01/24 PHP
php使用mysqli和pdo扩展,测试对比连接mysql数据库的效率完整示例
2019/05/09 PHP
bcastr2.0 通用的图片浏览器
2006/11/22 Javascript
javascript 读取图片文件的大小
2009/06/25 Javascript
javascript Onunload与Onbeforeunload使用小结
2009/12/31 Javascript
用XMLDOM和ADODB.Stream实现base64编码解码实现代码
2010/11/28 Javascript
基于jquery的设置页面文本框 只能输入数字的实现代码
2011/04/19 Javascript
一个挺有意思的Javascript小问题说明
2011/09/26 Javascript
Jquery全选与反选点击执行一次的解决方案
2015/08/14 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
js实现PC端根据IP定位当前城市地理位置
2017/02/22 Javascript
angularjs实现下拉列表的选中事件示例
2017/03/03 Javascript
React简单介绍
2017/05/24 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
解决vue-router 二级导航默认选中某一选项的问题
2019/11/01 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
Python isinstance判断对象类型
2008/09/06 Python
Python yield 使用方法浅析
2017/05/20 Python
基于python(urlparse)模板的使用方法总结
2017/10/13 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
python中协程实现TCP连接的实例分析
2018/10/14 Python
对python 判断数字是否小于0的方法详解
2019/01/26 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
猫途鹰英国网站:TripAdvisor英国(旅游社区和旅游评论)
2016/08/30 全球购物
薇姿法国官网:Vichy法国
2021/01/28 全球购物
心得体会开头
2014/01/01 职场文书
企业道德讲堂实施方案
2014/03/19 职场文书
继承公证书
2014/04/09 职场文书
优秀研究生主要事迹
2014/06/03 职场文书
法人代表任命书范本
2014/06/05 职场文书
中央空调节能方案
2014/06/15 职场文书
python 自动刷新网页的两种方法
2021/04/20 Python
go语言基础 seek光标位置os包的使用
2021/05/09 Golang