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 相关文章推荐
UTF8编码内的繁简转换的PHP类
Jul 09 PHP
php下封装较好的数字分页方法
Nov 23 PHP
关于file_get_contents返回为空或函数不可用的解决方案
Jun 24 PHP
PHP自动生成后台导航网址的最佳方法
Aug 27 PHP
destoon调用自定义模板及样式的公告栏
Jun 21 PHP
ThinkPHP实现将本地文件打包成zip下载
Jun 26 PHP
PHP中new static()与new self()的区别异同分析
Aug 22 PHP
php UNIX时间戳用法详解
Feb 16 PHP
php 调用ffmpeg获取视频信息的简单实现
Apr 03 PHP
Yii2.0建立公共方法简单示例
Jan 29 PHP
PHP+RabbitMQ实现消息队列的完整代码
Mar 20 PHP
Laravel find in set排序实例
Oct 09 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
PHP5 操作MySQL数据库基础代码
2009/09/29 PHP
PHP编写登录验证码功能 附调用方法
2016/05/19 PHP
PHP lcfirst()函数定义与用法
2019/03/08 PHP
JavaScript 特殊字符
2007/04/05 Javascript
轻量级 JS ToolTip提示效果
2010/07/20 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
详解vue.js的devtools安装
2017/05/26 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
vue中实现左右联动的效果
2018/06/22 Javascript
element-ui表格数据转换的示例代码
2018/08/24 Javascript
详解如何构建一个Angular6的第三方npm包
2018/09/07 Javascript
详解如何用typescript开发koa2的二三事
2018/11/13 Javascript
使用layui的layer组件做弹出层的例子
2019/09/27 Javascript
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
python获取一组汉字拼音首字母的方法
2015/07/01 Python
Python 多进程并发操作中进程池Pool的实例
2017/11/01 Python
Python从list类型、range()序列简单认识类(class)【可迭代】
2019/05/31 Python
pandas实现将dataframe满足某一条件的值选出
2019/06/12 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
Python异常原理及异常捕捉实现过程解析
2020/03/25 Python
html5-websocket基于远程方法调用的数据交互实现
2012/12/04 HTML / CSS
AmazeUI中模态框的实现
2020/08/19 HTML / CSS
C++是不是类型安全的
2014/02/18 面试题
2013年员工自我评价范文
2013/12/27 职场文书
公司薪酬管理制度
2014/01/31 职场文书
《听鱼说话》教学反思
2014/02/15 职场文书
互联网电子商务专业毕业生求职信
2014/03/18 职场文书
企业诚信承诺书
2014/05/23 职场文书
五一放假通知怎么写
2015/08/18 职场文书
2016年妇联“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
MySQL之DML语言
2021/04/05 MySQL
Django实现在线无水印抖音视频下载(附源码及地址)
2021/05/06 Python