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 相关文章推荐
Linux下 php5 MySQL5 Apache2 phpMyAdmin ZendOptimizer安装与配置[图文]
Nov 18 PHP
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
Oct 29 PHP
windows下开发并编译PHP扩展的方法
Mar 18 PHP
php empty() 检查一个变量是否为空
Nov 10 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
Jul 22 PHP
PHP中使用imagick实现把PDF转成图片
Jan 26 PHP
YII动态模型(动态表名)支持分析
Mar 29 PHP
php简单压缩css样式示例
Sep 22 PHP
浅谈php中的访问修饰符private、protected、public的作用范围
Nov 20 PHP
php rsa 加密,解密,签名,验签详解
Dec 06 PHP
laravel中数据显示方法(默认值和下拉option默认选中)
Oct 11 PHP
php判断IP地址是否在多个IP段内
Aug 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
磨咖啡豆的密诀
2021/03/03 冲泡冲煮
用PHP创建PDF中文文档
2006/10/09 PHP
PHP 5.3.0 安装分析心得
2009/08/07 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
php flush无效,IIS7下php实时输出的方法
2016/08/25 PHP
PHP实现求连续子数组最大和问题2种解决方法
2017/12/26 PHP
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
Jquery事件的连接使用示例
2013/06/18 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
Jquery在指定DIV加载HTML示例代码
2014/02/17 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
2014/10/22 Javascript
JS动态加载脚本并执行回调操作
2016/08/24 Javascript
微信小程序购物商城系统开发系列-目录结构介绍
2016/11/21 Javascript
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
Vue 过滤器filters及基本用法
2017/12/26 Javascript
Element-ui中元素滚动时el-option超出元素区域的问题
2019/05/30 Javascript
nodejs制作小爬虫功能示例
2020/02/24 NodeJs
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
[01:42:49]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第一场 2月26日
2021/03/11 DOTA
Python HTMLParser模块解析html获取url实例
2015/04/08 Python
python控制nao机器人身体动作实例详解
2019/04/29 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
python 实现turtle画图并导出图片格式的文件
2019/12/07 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
python3注册全局热键的实现
2020/03/22 Python
HTML5中form如何关闭自动完成功能的方法
2018/07/02 HTML / CSS
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
写一个方法1000的阶乘
2012/11/21 面试题
公司人力资源的自我评价
2014/01/02 职场文书
公务员培训自我鉴定
2014/02/01 职场文书
租房协议书怎么写
2014/04/10 职场文书
信访工作汇报材料
2014/10/27 职场文书
2014年职称评定工作总结
2014/11/26 职场文书
2015年九一八事变纪念日演讲稿
2015/03/19 职场文书
go语言基础 seek光标位置os包的使用
2021/05/09 Golang
基于Python实现nc批量转tif格式
2022/08/14 Python