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 源代码压缩小工具
Dec 22 PHP
php getimagesize 上传图片的长度和宽度检测代码
May 15 PHP
浅析PHP中的字符串编码转换(自动识别原编码)
Jul 02 PHP
php截取中文字符串函数实例
Feb 23 PHP
PHP 开发者该知道的 5 个 Composer 小技巧
Feb 03 PHP
php中引用&amp;的用法分析【变量引用,函数引用,对象引用】
Dec 12 PHP
删除PHP数组中头部、尾部、任意元素的实现代码
Apr 10 PHP
php 可变函数使用小结
Jun 12 PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
Oct 12 PHP
Thinkphp5.0框架视图view的循环标签用法示例
Oct 12 PHP
Laravel框架实现定时Task Scheduling例子
Oct 22 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
Terran魔法科技
2020/03/14 星际争霸
php数组键名技巧小结
2015/02/17 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
PHP 多进程与信号中断实现多任务常驻内存管理实例方法
2019/10/04 PHP
javascript 面向对象继承
2009/11/26 Javascript
JS 去前后空格大全(IE9亲测)
2013/07/15 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
jquery使用hide方法隐藏指定id的元素
2015/03/30 Javascript
快速入门Vue
2016/12/19 Javascript
js 动态生成html 触发事件传参字符转义的实例
2017/02/14 Javascript
详解webpack分离css单独打包
2017/06/21 Javascript
JavaScript实现数值自动增加动画
2017/12/28 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
JS+CSS3实现的简易钟表效果示例
2019/04/13 Javascript
layui点击弹框页面 表单请求的方法
2019/09/21 Javascript
详解微信小程序之提高应用速度小技巧
2020/01/07 Javascript
vue data对象重新赋值无效(未更改)的解决方式
2020/07/24 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
JS实现简易日历效果
2021/01/25 Javascript
浅谈Python2.6和Python3.0中八进制数字表示的区别
2017/04/28 Python
pandas重新生成索引的方法
2018/11/06 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
pytorch读取图像数据转成opencv格式实例
2020/06/02 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
2020/06/23 Python
利用scikitlearn画ROC曲线实例
2020/07/02 Python
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
世界上最大的家庭自动化公司:Smarthome
2017/12/20 全球购物
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
大二自我鉴定范文
2013/10/05 职场文书
初中学校军训方案
2014/05/09 职场文书
植树节标语
2014/06/27 职场文书
中学生勤俭节约倡议书
2015/04/29 职场文书
初三化学教学反思
2016/02/22 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书
Springboot/Springcloud项目集成redis进行存取的过程解析
2021/12/04 Redis
Docker部署Mysql8的实现步骤
2022/07/07 Servers