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代码简化
Feb 08 PHP
php编程实现获取excel文档内容的代码实例
Jun 28 PHP
PHP循环语句笔记(foreach,list)
Nov 29 PHP
PHP设计模式之解释器模式的深入解析
Jun 13 PHP
php通过数组实现多条件查询实现方法(字符串分割)
May 06 PHP
PHP中date与gmdate的区别及默认时区设置
May 12 PHP
使用配置类定义Codeigniter全局变量
Jun 12 PHP
PHP 面向对象程序设计(oop)学习笔记 (五) - PHP 命名空间
Jun 12 PHP
PHP图片自动裁切应付不同尺寸的显示
Oct 16 PHP
php简单压缩css样式示例
Sep 22 PHP
PHP实现git部署的方法教程
Dec 19 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
Sep 12 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数组冒泡排序算法实例
2016/05/06 PHP
Laravel下生成验证码的类
2017/11/15 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
jquery实现excel导出的方法
2013/04/04 Javascript
使用Js让Html中特殊字符不被转义
2013/11/05 Javascript
JS弹出层的显示与隐藏示例代码
2013/12/27 Javascript
javascript简单实现图片预加载
2014/12/03 Javascript
javascript数组克隆简单实现方法
2015/12/16 Javascript
值得分享的Bootstrap Ace模板实现菜单和Tab页效果
2015/12/30 Javascript
jQuery继承extend用法详解
2016/10/10 Javascript
Bootstrap模态框水平垂直居中与增加拖拽功能
2016/11/09 Javascript
从零学习node.js之express入门(六)
2017/02/25 Javascript
在vue中实现点击选择框阻止弹出层消失的方法
2018/09/15 Javascript
CSS3 动画卡顿性能优化的完美解决方案
2018/09/20 Javascript
JS中实现一个下载进度条及播放进度条的代码
2019/06/10 Javascript
详谈vue中router-link和传统a链接的区别
2020/07/22 Javascript
微信小程序实现日历签到
2020/09/21 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
树莓派中python获取GY-85九轴模块信息示例
2013/12/05 Python
python妹子图简单爬虫实例
2015/07/07 Python
Python字符串格式化输出方法分析
2016/04/13 Python
ubuntu中配置pyqt4环境教程
2017/12/27 Python
Python hashlib模块用法实例分析
2018/06/12 Python
对Python3之进程池与回调函数的实例详解
2019/01/22 Python
python将字符串list写入excel和txt的实例
2019/07/20 Python
python 命令行传入参数实现解析
2019/08/30 Python
Python彻底删除文件夹及其子文件方式
2019/12/23 Python
利用Python实现自动扫雷小脚本
2020/12/17 Python
修复iPhone的safari浏览器上submit按钮圆角bug
2012/12/24 HTML / CSS
MAC彩妆英国官网:M·A·C UK
2018/05/30 全球购物
您在慕尼黑的跑步商店:Lauf-bar
2019/10/11 全球购物
高级方案规划工程师岗位职责
2013/11/29 职场文书
平民服装店创业计划书
2014/01/17 职场文书
文明青少年标兵事迹材料
2014/01/28 职场文书
监察建议书格式
2014/05/19 职场文书
让子弹飞观后感
2015/06/11 职场文书