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 相关文章推荐
PHP4中实现动态代理
Oct 09 PHP
PHP新手上路(十四)
Oct 09 PHP
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
Sep 02 PHP
生成卡号php代码
Apr 09 PHP
ecshop 订单确认中显示省市地址信息的方法
Mar 15 PHP
利用谷歌 Translate API制作自己的翻译脚本
Jun 04 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
Aug 14 PHP
递归实现php数组转xml的代码分享
May 14 PHP
CI框架集成Smarty的方法分析
May 17 PHP
php版微信公众账号第三方管理工具开发简明教程
Sep 23 PHP
PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
Nov 25 PHP
如何通过Apache在本地配置多个虚拟主机
Jul 29 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
thinkphp中字符截取函数msubstr()用法分析
2016/01/09 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
javascript网页关键字高亮代码
2008/07/30 Javascript
javascript 二分法(数组array)
2010/04/24 Javascript
Json对象替换字符串占位符实现代码
2010/11/17 Javascript
JS 无限级 Select效果实现代码(json格式)
2011/08/30 Javascript
jquery ajax中使用jsonp的限制解决方法
2013/11/22 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
2015/09/17 Javascript
微信小程序手势操作之单触摸点与多触摸点
2017/03/10 Javascript
详解webpack 多入口配置
2017/06/16 Javascript
Angularjs中ng-repeat的简单实例
2017/08/25 Javascript
vue实现消息的无缝滚动效果的示例代码
2017/12/05 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
Vue实现用户自定义字段显示数据的方法
2018/08/28 Javascript
js验证身份证号码记录的方法
2019/04/26 Javascript
[46:55]Ti4 冒泡赛第二轮 LGD vs C9
2014/07/14 DOTA
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
python用Pygal如何生成漂亮的SVG图像详解
2017/02/10 Python
Python操作MySQL模拟银行转账
2018/03/12 Python
谈一谈基于python的面向对象编程基础
2019/05/21 Python
python爬虫之快速对js内容进行破解
2019/07/09 Python
python根据文本生成词云图代码实例
2019/11/15 Python
Python logging模块原理解析及应用
2020/08/13 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
HTML5 body设置自适应全屏
2020/05/07 HTML / CSS
Mio Skincare法国官网:身体紧致及孕期身体护理
2018/04/04 全球购物
毕业求职自荐信格式是什么
2013/11/19 职场文书
园林毕业生自我鉴定范文
2013/12/29 职场文书
财会专业毕业生自荐信
2014/07/09 职场文书
人事专员岗位说明书
2014/07/29 职场文书
会计学习心得体会
2014/09/09 职场文书
辩护词格式
2015/05/22 职场文书
2015年机关作风和效能建设工作总结
2015/07/23 职场文书
安全教育主题班会总结
2015/08/14 职场文书
你有一份《诚信考试承诺书》待领取
2019/11/13 职场文书