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 相关文章推荐
PHP文章按日期(月日)SQL归档语句
Nov 29 PHP
PHP插入排序实现代码
Apr 04 PHP
鸡肋的PHP单例模式应用详解
Jun 03 PHP
浅谈ThinkPHP的URL重写
Nov 25 PHP
php中使用url传递数组的方法
Feb 11 PHP
php正则表达式获取内容所有链接
Jul 24 PHP
PHP中的session安全吗?
Jan 22 PHP
php制作简单模版引擎
Apr 07 PHP
php生成图片验证码的方法
Apr 15 PHP
PHP fprintf()函数用法讲解
Feb 16 PHP
php快速导入大量数据的实例方法
Sep 23 PHP
gearman中任务的优先级和返回状态实例分析
Feb 27 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
新的一年,新的期待:DC在2020年的四部动画电影
2020/01/01 欧美动漫
php自动适应范围的分页代码
2008/08/05 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
php图片的二进制转换实现方法
2014/12/15 PHP
windows7下php开发环境搭建图文教程
2015/01/06 PHP
基于PHP实现的事件机制实例分析
2015/06/18 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
javascript控制swfObject应用介绍
2012/11/29 Javascript
JavaScript正则表达式之multiline属性的应用
2015/06/16 Javascript
jQuery使用经验小技巧(推荐)
2016/05/31 Javascript
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
BootStrap 图标icon符号图标glyphicons不正常显示的快速解决办法
2016/12/08 Javascript
javascript 显示全局变量与隐式全局变量的区别
2017/02/09 Javascript
使用node.js搭建服务器
2017/05/20 Javascript
vue.js 微信支付前端代码分享
2018/02/10 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
2018/03/02 Javascript
Angular6封装http请求的步骤详解
2018/08/13 Javascript
浅析vue给不同环境配置不同打包命令
2018/08/17 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
详解Vue项目部署遇到的问题及解决方案
2019/01/11 Javascript
vue改变循环遍历后的数据实例
2019/11/07 Javascript
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
django 常用orm操作详解
2017/09/13 Python
Python实现读写INI配置文件的方法示例
2018/06/09 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
2018/12/12 Python
使用python批量转换文件编码为UTF-8的实现
2020/04/03 Python
美国户外烹饪产品购物网站:Outdoor Cooking
2020/01/10 全球购物
入党积极分子思想汇报范文
2014/01/05 职场文书
2014庆六一活动方案
2014/03/02 职场文书
企业承诺书格式
2014/05/21 职场文书
经济贸易系求职信
2014/08/04 职场文书
公司仓库管理制度
2015/08/04 职场文书
《女娲补天》教学反思
2016/02/20 职场文书
社区结对共建协议书
2016/03/23 职场文书
Python可视化神器pyecharts绘制地理图表
2022/07/07 Python