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 相关文章推荐
WINXP下apache+php4+mysql
Nov 25 PHP
PHP关联数组的10个操作技巧
Jan 21 PHP
深入分析php之面向对象
May 15 PHP
ThinkPHP标签制作教程
Jul 10 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
Oct 15 PHP
PHP调试函数和日志记录函数分享
Jan 31 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
Apr 17 PHP
ThinkPHP里用U方法调用js文件实例
Jun 18 PHP
功能强大的php分页函数
Jul 20 PHP
php插件Xajax使用方法详解
Aug 31 PHP
PHP实现通过CURL上传文件功能示例
May 30 PHP
总结PHP代码规范、流程规范、git规范
Jun 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
打造计数器DIY三步曲(中)
2006/10/09 PHP
IIS6.0+PHP5.x+MySQL5.x+Zend3.0x+GD+phpMyAdmin2.8x通用安装实例(已经完成)
2006/12/06 PHP
PHP Google的translate API代码
2008/12/10 PHP
!DOCTYPE声明对JavaScript的影响分析
2010/04/12 Javascript
Jquery增加鼠标中间功能mousewheel的实例代码
2013/09/05 Javascript
JavaScript的21条基本知识点
2014/03/04 Javascript
javascript实现俄罗斯方块游戏的思路和方法
2015/04/27 Javascript
Summernote实现图片上传功能的简单方法
2016/07/11 Javascript
利用JavaScript实现拖拽改变元素大小
2016/12/14 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
jQuery Datatables表头不对齐的解决办法
2017/11/27 jQuery
nodejs 简单实现动态html的方法
2018/05/12 NodeJs
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
jQuery pager.js 插件动态分页功能实例分析
2019/08/02 jQuery
小程序使用watch监听数据变化的方法详解
2019/09/20 Javascript
判断JavaScript中的两个变量是否相等的操作符
2019/12/21 Javascript
js与jquery获取input输入框中的值实例讲解
2020/02/27 jQuery
[57:36]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第三场 2月1日
2021/03/11 DOTA
老生常谈Python进阶之装饰器
2017/05/11 Python
django 中QuerySet特性功能详解
2019/07/25 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
基于python调用jenkins-cli实现快速发布
2020/08/14 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
马德里竞技官方网上商店:Atletico Madrid Shop
2019/03/31 全球购物
Etam俄罗斯:法国女士内衣和家居服网上商店
2019/10/30 全球购物
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
什么是smarty? Smarty的优点是什么?
2013/08/11 面试题
证婚人经典证婚词
2014/01/09 职场文书
法制宣传口号
2014/06/16 职场文书
法语专业求职信
2014/07/20 职场文书
学校交通安全责任书
2014/08/25 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP
mysql备份策略的实现(全量备份+增量备份)
2021/07/07 MySQL
Mysql开启外网访问
2022/05/15 MySQL