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 函数学习简单小结
Jul 08 PHP
fleaphp常用方法分页之Pager使用方法
Apr 23 PHP
php.ini中date.timezone设置分析
Jul 29 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
Feb 14 PHP
php用正则表达式匹配URL的简单方法
Nov 12 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
Apr 30 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
Mar 21 PHP
Laravel中错误与异常处理的用法示例
Sep 16 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
Sep 09 PHP
PHP使用openssl扩展实现加解密方法示例
Feb 20 PHP
PHP const定义常量及global定义全局常量实例解析
May 28 PHP
Laravel统一错误处理为JSON的方法介绍
Oct 18 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
PHILIPS L4X25T电路分析和打理
2021/03/02 无线电
PHP截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
PHP 类型转换函数intval
2009/06/20 PHP
php下目前为目最全的CURL中文说明
2010/08/01 PHP
PHP文件上传主要代码讲解
2013/09/30 PHP
PHP实现长文章分页实例代码(附源码)
2016/02/03 PHP
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
innerhtml用法 innertext用法 以及innerHTML与innertext的区别
2009/10/26 Javascript
ExtJs使用IFrame的实现代码
2010/03/24 Javascript
js function定义函数使用心得
2010/04/15 Javascript
js几秒以后倒计时跳转示例
2013/12/26 Javascript
js遍历子节点子元素附属性及方法
2014/08/19 Javascript
跟我学习javascript的for循环和for...in循环
2015/11/18 Javascript
javascript的几种写法总结
2016/09/30 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
angular.js指令中的controller、compile与link函数的不同之处
2017/05/10 Javascript
js根据需要计算数组中重复出现某个元素的个数
2019/01/18 Javascript
jQuery表单元素过滤选择器用法实例分析
2019/02/20 jQuery
js实现简单掷骰子小游戏
2019/10/24 Javascript
vue 实现websocket发送消息并实时接收消息
2019/12/09 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
typescript编写微信小程序创建项目的方法
2021/01/29 Javascript
分析Python的Django框架的运行方式及处理流程
2015/04/08 Python
Python利用字典破解WIFI密码的方法
2019/02/27 Python
Django框架 Pagination分页实现代码实例
2019/09/04 Python
python tkinter canvas使用实例
2019/11/04 Python
python 追踪except信息方式
2020/04/25 Python
canvas实现圆形进度条动画的示例代码
2017/12/26 HTML / CSS
美国最大的网上冲印店:Shutterfly
2017/01/01 全球购物
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
经济实惠的豪华家具:My-Furniture
2019/03/12 全球购物
校园标语大全
2014/06/19 职场文书
2015年党员干部承诺书
2015/01/21 职场文书
挂职个人工作总结
2015/03/05 职场文书
小学生作文写作技巧100例,非常实用!
2019/07/08 职场文书
python 下载文件的几种方式分享
2021/04/07 Python