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 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
Nov 14 PHP
php中3des加密代码(完全与.net中的兼容)
Aug 02 PHP
PHPMailer邮件发送的实现代码
May 04 PHP
PHP提交表单失败后如何保留已经填写的信息
Jun 20 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(五)
Jun 23 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
Dec 15 PHP
thinkphp 手机号和用户名同时登录
Jan 20 PHP
thinkPHP5实现的查询数据库并返回json数据实例
Oct 23 PHP
PHP给前端返回一个JSON对象的实例讲解
May 31 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
Oct 15 PHP
php将字符串转换为数组实例讲解
May 05 PHP
goto语法在PHP中的使用教程
Sep 17 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
当海贼王变成JOJO风
2020/03/02 日漫
PHP中通过ADO调用Access数据库的方法测试不通过
2006/12/31 PHP
PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
2011/06/04 PHP
php获取post中的json数据的实现方法
2011/06/08 PHP
PHP APC的安装与使用详解
2013/06/13 PHP
PHP通过串口实现发送短信
2015/07/08 PHP
php arsort 数组降序排序详细介绍
2016/11/17 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
JS 无限级 Select效果实现代码(json格式)
2011/08/30 Javascript
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
深入理解JavaScript是如何实现继承的
2013/12/12 Javascript
jQuery前端框架easyui使用Dialog时bug处理
2014/12/05 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
javascript实现简易计算器的代码
2016/05/31 Javascript
jQuery插件实现图片轮播特效
2016/06/16 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
Node.js连接mongodb实例代码
2017/06/06 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
微信小程序实现时间预约功能
2018/11/27 Javascript
小程序点击图片实现自动播放视频
2020/05/29 Javascript
jQuery选择器之基本过滤选择器用法实例分析
2019/02/19 jQuery
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
Vue快速实现通用表单验证的方法
2020/02/24 Javascript
[02:28]DOTA2 2017国际邀请赛小组赛回顾
2017/08/09 DOTA
[50:58]2018DOTA2亚洲邀请赛3月29日 小组赛A组OpTic VS Newbee
2018/03/30 DOTA
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
pyenv命令管理多个Python版本
2017/03/26 Python
使用Python对微信好友进行数据分析
2018/06/27 Python
Python实现Mysql数据统计及numpy统计函数
2019/07/15 Python
python lambda的使用详解
2021/02/26 Python
韩国流行时尚女装网站:Dintchina(中文)
2018/07/19 全球购物
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern "C"
2014/08/09 面试题
网络工程专业自荐信范文
2014/03/16 职场文书
仓库管理员岗位职责
2014/03/19 职场文书
上课随便讲话检讨书
2014/09/12 职场文书
借条格式范本
2015/05/25 职场文书