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 开源AJAX框架14种
Aug 24 PHP
php常用Output和ptions/Info函数集介绍
Jun 19 PHP
ThinkPHP之import方法实例详解
Jun 20 PHP
PHP调用wsdl文件类型的接口代码分享
Nov 19 PHP
php实现格式化多行文本为Js可用格式
Apr 15 PHP
php检查字符串中是否有外链的方法
Jul 29 PHP
PHP内核学习教程之php opcode内核实现
Jan 27 PHP
PHP CURL post数据报错 failed creating formpost data
Oct 16 PHP
php使用正则表达式去掉html中的注释方法
Nov 03 PHP
Linux下源码包安装Swoole及基本使用操作图文详解
Apr 02 PHP
YII2框架中添加自定义模块的方法实例分析
Mar 18 PHP
PHP配置文件php.ini中打开错误报告的设置方法
Jan 09 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 SQL防注入代码集合
2008/04/25 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
PHP类相关知识点实例总结
2016/09/28 PHP
php精度计算的问题解析
2019/06/21 PHP
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
javascript 中String.match()与RegExp.exec()的区别说明
2013/01/10 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
jquery实现鼠标滑过显示提示框的方法
2015/02/05 Javascript
轻量级网页遮罩层jQuery插件用法实例
2015/07/31 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
常见JS验证脚本汇总
2015/12/01 Javascript
Javascript数组Array方法解读
2016/03/13 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
js仿支付宝多方框输入支付密码效果
2016/09/27 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
2017/01/20 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
2017/06/26 Javascript
利用node.js如何创建子进程详解
2017/12/09 Javascript
jQuery实现判断上传图片类型和大小的方法示例
2018/04/11 jQuery
深入浅析var,let,const的异同点
2018/08/07 Javascript
JS数组实现分类统计实例代码
2018/09/30 Javascript
JS实现移动端双指缩放和旋转方法
2019/12/13 Javascript
python使用reportlab实现图片转换成pdf的方法
2015/05/22 Python
Python正则表达式教程之二:捕获篇
2017/03/02 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
加拿大购物频道:The Shopping Channel
2016/07/21 全球购物
实习教师个人的自我评价
2013/11/08 职场文书
入党申请人的自我鉴定
2013/12/01 职场文书
2014年小学数学工作总结
2014/12/12 职场文书
音乐课外活动总结
2015/05/09 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书
《小摄影师》教学反思
2016/02/18 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
PHP正则表达式之RCEService回溯
2022/04/11 PHP