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 相关文章推荐
Mysql数据库操作类( 1127版,提供源码下载 )
Dec 02 PHP
PHP Curl多线程原理实例详解
Nov 06 PHP
php setcookie函数的参数说明及其用法
Apr 20 PHP
PHP strtotime函数用法、实现原理和源码分析
Feb 04 PHP
php提交表单发送邮件的方法
Mar 20 PHP
php实现短信发送代码
Jul 05 PHP
php实现smarty模板无限极分类的方法
Dec 07 PHP
PHP标准类(stdclass)用法示例
Sep 28 PHP
利用PHP生成CSV文件简单示例
Dec 21 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
Apr 07 PHP
PHP 二维array转换json的实例讲解
Aug 21 PHP
Codeigniter里的无刷新上传的实现代码
Apr 14 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/10/25 PHP
PHP中调用SVN命令更新网站方法
2015/01/07 PHP
PHP 设计模式系列之 specification规格模式
2016/01/10 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
PHP执行普通shell命令流程解析
2020/08/24 PHP
基于Jquery实现表格动态分页实现代码
2011/06/21 Javascript
JQuery动态创建DOM、表单元素的实现代码
2011/08/09 Javascript
JavaScript检查数字是否为整数或浮点数的方法
2015/06/09 Javascript
谈谈Jquery中的children find 的区别有哪些
2015/10/19 Javascript
Angularjs中使用Filters详解
2016/03/11 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
JavaScript数据类型转换的注意事项
2016/07/31 Javascript
完美解决jQuery符号$与其他javascript 库、框架冲突的问题
2016/08/09 Javascript
jquery实现(textarea)placeholder自动换行
2016/12/22 Javascript
vuex中使用对象展开运算符的示例
2017/09/25 Javascript
微信小程序导入Vant报错VM292:1 thirdScriptError的解决方法
2019/08/01 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
vue-video-player实现实时视频播放方式(监控设备-rtmp流)
2020/08/10 Javascript
Node在Controller层进行数据校验的过程详解
2020/08/28 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
python实现在控制台输入密码不显示的方法
2015/07/02 Python
详解 Python中LEGB和闭包及装饰器
2017/08/03 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
Python基础教程之输入输出和运算符
2020/07/26 Python
详解pycharm配置python解释器的问题
2020/10/15 Python
python openpyxl模块的使用详解
2021/02/25 Python
阿提哈德航空官方网站:Etihad Airways
2017/01/06 全球购物
bonprix荷兰网上商店:便宜的服装、鞋子和家居用品
2020/07/04 全球购物
幼儿园三八妇女节活动方案
2014/03/11 职场文书
护士长竞聘书
2014/03/31 职场文书
医德医风个人总结
2015/02/28 职场文书
如何使用flask将模型部署为服务
2021/05/13 Python
MyBatis 动态SQL全面详解
2021/10/05 MySQL
试用1103暨1103、1101同门大比武 [ DAIWEI ]
2022/04/05 无线电