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 相关文章推荐
PHPlet在Windows下的安装
Oct 09 PHP
使用adodb lite解决问题
Dec 31 PHP
PHP学习资料汇总与网址
Mar 16 PHP
探寻PHP脚本不报错的原因
Jun 12 PHP
php实现的mongodb操作类
May 28 PHP
使用PHP similar text计算两个字符串相似度
Nov 06 PHP
如何写php守护进程(Daemon)
Dec 30 PHP
thinkphp3.x中cookie方法的用法分析
May 19 PHP
Yii2实现log输出到file及database的方法
Nov 12 PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
Aug 10 PHP
php并发加锁问题分析与设计代码实例讲解
Feb 26 PHP
php7中停止php-fpm服务的方法详解
May 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
第九节--绑定
2006/11/16 PHP
PHP实现简单汉字验证码
2015/07/28 PHP
PHP中each与list用法分析
2016/01/08 PHP
thinkPHP中U方法加密传递参数功能示例
2018/05/29 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
Thinkphp5框架ajax接口实现方法分析
2019/08/28 PHP
Extjs中通过Tree加载右侧TabPanel具体实现
2013/05/05 Javascript
js创建对象的区别示例介绍
2014/07/24 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
js中用cssText设置css样式的简单方法
2016/09/19 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
JS+HTML5实现图片在线预览功能
2017/07/22 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
2020/01/03 Javascript
Vue路由权限控制解析
2020/11/09 Javascript
[10:07]2014DOTA2国际邀请赛 实拍选手现场观战DK对阵Titan
2014/07/12 DOTA
Python实现字典去除重复的方法示例
2017/07/31 Python
Python基础教程之利用期物处理并发
2018/03/29 Python
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
python 删除非空文件夹的实例
2018/04/26 Python
Flask web开发处理POST请求实现(登录案例)
2018/07/26 Python
mac PyCharm添加Python解释器及添加package路径的方法
2018/10/29 Python
Django框架安装及项目创建过程解析
2020/09/14 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
Python绘制K线图之可视化神器pyecharts的使用
2021/03/02 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
详解如何在登录过期后跳出Ifram框架
2020/09/10 HTML / CSS
微软瑞士官方网站:Microsoft瑞士
2018/04/20 全球购物
车祸赔偿收入证明
2014/01/09 职场文书
演讲主持词
2014/03/18 职场文书
四风查摆问题自查报告
2014/10/10 职场文书
2015年招聘工作总结
2014/12/12 职场文书
考察邀请函范文
2015/01/31 职场文书
2015年预防青少年违法犯罪工作总结
2015/05/22 职场文书