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 相关文章推荐
如何提高MYSQL数据库的查询统计速度 select 索引应用
Apr 11 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
Apr 02 PHP
基于php设计模式中工厂模式详细介绍
May 15 PHP
PHP两种快速排序算法实例
Feb 15 PHP
php文件操作之小型留言本实例
Jun 20 PHP
PHP+shell实现多线程的方法
Jul 01 PHP
PHP使用ODBC连接数据库的方法
Jul 18 PHP
ThinkPHP自定义Redis处理SESSION的实现方法
May 16 PHP
php版微信发红包接口用法示例
Sep 23 PHP
利用PHP访问带有密码的Redis方法示例
Feb 09 PHP
实例分析10个PHP常见安全问题
Jul 09 PHP
PHP 对象继承原理与简单用法示例
Apr 21 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
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
php输入流php://input使用示例(php发送图片流到服务器)
2013/12/25 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
php四种定界符详解
2017/02/16 PHP
Laravel-admin之修改操作日志的方法
2019/09/30 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
iframe调用父页面函数示例详解
2014/07/17 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
JavaScript 学习笔记之数据类型
2015/01/14 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
学习JavaScript设计模式(多态)
2015/11/25 Javascript
JavaScript实现弹出模态窗体并接受传值的方法
2016/02/12 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
jqGrid用法汇总(全经典)
2016/06/28 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
关于jQuery库冲突的完美解决办法
2017/05/20 jQuery
vue项目中使用百度地图的方法
2018/06/08 Javascript
一篇文章带你浅入webpack的DLL优化打包
2020/02/20 Javascript
[43:26]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第二场 11.20
2020/11/23 DOTA
Python 条件判断的缩写方法
2008/09/06 Python
Python中列表、字典、元组、集合数据结构整理
2014/11/20 Python
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
Python科学画图代码分享
2017/11/29 Python
ubuntu环境下python虚拟环境的安装过程
2018/01/07 Python
Python退火算法在高次方程的应用
2018/07/26 Python
在Pycharm中调试Django项目程序的操作方法
2019/07/17 Python
python如何通过pyqt5实现进度条
2020/01/20 Python
没编程基础可以学python吗
2020/06/17 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
2020/07/15 Python
美国宠物美容和宠物用品购物网站:Cherrybrook
2018/12/07 全球购物
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
债务授权委托书范本
2014/10/17 职场文书
事业单位个人总结
2015/02/12 职场文书
Log4j.properties配置及其使用
2021/08/02 Java/Android