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
Dec 13 PHP
PHP面向对象编程快速入门
Dec 14 PHP
简单的php数据库操作类代码(增,删,改,查)
Apr 08 PHP
php加密解密实用类分享
Jan 07 PHP
php反射应用示例
Feb 25 PHP
跟我学Laravel之快速入门
Oct 15 PHP
PHP设置头信息及取得返回头信息的方法
Jan 25 PHP
php基于单例模式封装mysql类完整实例
Oct 18 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
Sep 16 PHP
PHP写API输出的时用echo的原因详解
Apr 28 PHP
PHP命名空间用法实例分析
Sep 04 PHP
PHP如何获取Cookie并实现模拟登录
Jul 16 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和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
php网页病毒清除类
2014/12/08 PHP
在Linux系统的服务器上隐藏PHP版本号的方法
2015/06/06 PHP
PHP文件操作实例总结
2016/09/27 PHP
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
PHP7 mongoDB扩展使用的方法分享
2019/05/02 PHP
javascript showModalDialog模态对话框使用说明
2009/12/31 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
2016/01/30 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
JS实现类似51job上的地区选择效果示例
2016/11/17 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
2017/07/18 Javascript
10个在JavaScript开发中常遇到的BUG
2017/12/18 Javascript
react实现点击选中的li高亮的示例代码
2018/05/24 Javascript
React降级配置及Ant Design配置详解
2018/12/27 Javascript
关于vue-cli 3配置打包优化要点(推荐)
2019/04/22 Javascript
Vue路由守卫之路由独享守卫
2019/09/25 Javascript
[01:13:46]iG vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现矩阵乘法的方法
2015/06/28 Python
Python 爬虫学习笔记之多线程爬虫
2016/09/21 Python
Python 基础知识之字符串处理
2017/01/06 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
2019/08/30 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
python设置中文界面实例方法
2020/10/27 Python
英国度假别墅预订:Sykes Cottages
2017/06/12 全球购物
Ootori在线按摩椅店:一家专业的按摩椅制造商
2019/04/10 全球购物
高中生的学习总结自我鉴定
2013/10/26 职场文书
银行委托书范本
2014/09/28 职场文书
世界红十字日活动总结
2015/02/10 职场文书
自荐信格式模板
2015/03/27 职场文书
新学期感想
2015/08/10 职场文书
Oracle中日期的使用方法实例
2022/07/07 Oracle
css清除浮动clearfix:after的用法详解(附完整代码)
2023/05/21 HTML / CSS