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下过滤HTML代码的函数
Dec 10 PHP
php学习之 认清变量的作用范围
Jan 26 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
Jun 04 PHP
PHP获取用户的浏览器与操作系统信息的代码
Sep 04 PHP
如何使用PHP实现javascript的escape和unescape函数
Jun 29 PHP
PHP四大安全策略
Mar 12 PHP
PHP入门经历和学习过程分享
Apr 11 PHP
PHP的preg_match匹配字符串长度问题解决方法
May 03 PHP
php之readdir函数用法实例
Nov 13 PHP
PHP实现批量修改文件后缀名的方法
Jul 30 PHP
PHP实现的数组和XML文件相互转换功能示例
Mar 15 PHP
PHP高并发和大流量解决方案整理
Mar 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
解析php取整的几种方式
2013/06/25 PHP
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
mac下安装nginx和php
2013/11/04 PHP
PHP图片处理之图片背景、画布操作
2014/11/19 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
Yii2框架加载css和js文件的方法分析
2019/05/25 PHP
Javascript面向对象之四 继承
2011/02/08 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
2016/06/23 Javascript
JavaScript中return用法示例
2016/11/29 Javascript
Bootstrap的modal拖动效果
2016/12/25 Javascript
关于vue.js v-bind 的一些理解和思考
2017/06/06 Javascript
JavaScript常用数学函数用法示例
2018/05/14 Javascript
JS基于封装函数实现的表格分页完整示例
2018/06/26 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
详解Node.js异步处理的各种写法
2019/06/09 Javascript
vue实现点击按钮下载文件功能
2019/10/11 Javascript
vue 实现v-for循环回来的数据动态绑定id
2019/11/07 Javascript
JavaScript ECMA-262-3 深入解析(一):执行上下文实例分析
2020/04/25 Javascript
vue使用过滤器格式化日期
2021/01/20 Vue.js
跟老齐学Python之赋值,简单也不简单
2014/09/24 Python
Python Queue模块详解
2014/11/30 Python
归纳整理Python中的控制流语句的知识点
2015/04/14 Python
详解Python中最难理解的点-装饰器
2017/04/03 Python
python利用OpenCV2实现人脸检测
2020/04/16 Python
python 实现调用子文件下的模块方法
2018/12/07 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
Python中zip函数如何使用
2020/06/04 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
意大利在线药房:Saninforma
2021/02/11 全球购物
linux比较文件内容的命令是什么
2015/09/23 面试题
若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?
2016/10/17 面试题
光电信息专业应届生求职信
2013/10/07 职场文书
求职信模板怎么做
2014/01/26 职场文书
新学期开学寄语2016
2015/12/04 职场文书
HTML基本元素标签介绍
2022/02/28 HTML / CSS