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 相关文章推荐
综合图片计数器
Oct 09 PHP
PHP+Mysql+Ajax+JS实现省市区三级联动
May 23 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
Nov 17 PHP
PHP闭包函数传参及使用外部变量的方法
Mar 15 PHP
浅析Yii2 GridView 日期格式化并实现日期可搜索教程
Apr 22 PHP
PHP的openssl加密扩展使用小结(推荐)
Jul 18 PHP
Laravel5.1自定义500错误页面示例
Oct 09 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
Yii2.0框架模型多表关联查询示例
Jul 18 PHP
Laravel 创建指定表 migrate的例子
Oct 09 PHP
php实现统计IP数及在线人数的示例代码
Jul 22 PHP
PHP队列场景以及实现代码实例详解
Feb 26 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
php上传文件问题汇总
2015/01/30 PHP
PHP实现生成模糊图片的方法示例
2017/12/21 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
2020/08/06 PHP
ExtJS PropertyGrid中使用Combobox选择值问题
2010/06/13 Javascript
jquery获取当前点击对象的value方法
2014/02/28 Javascript
javascript中hasOwnProperty() 方法使用指南
2015/03/09 Javascript
jQuery寻找n以内完全数的方法
2015/06/24 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
基于JavaScript如何制作遮罩层对话框
2016/01/26 Javascript
jQuery zTree加载树形菜单功能
2016/02/25 Javascript
微信小程序 开发工具快捷键整理
2016/10/31 Javascript
jQuery排序插件tableSorter使用方法
2017/02/10 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
Vue使用NPM方式搭建项目
2018/10/25 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
nodejs实现UDP组播示例方法
2019/11/04 NodeJs
wxpython 学习笔记 第一天
2009/02/09 Python
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
详解pyqt5 动画在QThread线程中无法运行问题
2018/05/05 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
2018/05/30 Python
python for和else语句趣谈
2019/07/02 Python
使用Python函数进行模块化的实现
2019/11/15 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
用CSS3实现背景渐变的方法
2015/07/14 HTML / CSS
详解WebSocket跨域问题解决
2018/08/06 HTML / CSS
Vans(范斯)德国官网:美国南加州的原创极限运动潮牌
2017/05/02 全球购物
荷兰牛仔裤网上商店:Jeans Centre
2018/04/03 全球购物
Lentiamo荷兰:在线订购隐形眼镜、隐形眼镜液和太阳镜
2019/10/25 全球购物
迪卡侬中国官网:Decathlon中国
2020/08/10 全球购物
医学生自荐信
2013/12/03 职场文书
募捐倡议书怎么写
2014/05/14 职场文书
2015年度企业工作总结
2015/05/21 职场文书
统招统分证明
2015/06/23 职场文书
关于分班的感言
2015/08/04 职场文书
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python
英国数字版游戏销量周榜公布 《小缇娜的奇幻之地》登顶
2022/04/03 其他游戏