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发电子邮件
Oct 09 PHP
支持中文的php加密解密类代码
Nov 27 PHP
PHP仿盗链代码
Jun 03 PHP
php实现图片添加描边字和马赛克的方法
Dec 10 PHP
9个实用的PHP代码片段分享
Jan 22 PHP
php基于socket实现SMTP发送邮件的方法
Mar 05 PHP
PHP中使用curl伪造IP的简单方法
Aug 07 PHP
ThinkPHP中使用Ueditor富文本编辑器
Sep 02 PHP
WordPress开发中的get_post_custom()函数使用解析
Jan 04 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
PHP实现浏览器中直接输出图片的方法示例
Mar 14 PHP
PHPstorm激活码2020年5月13日亲测有效
Sep 17 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
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
PHP防止图片盗用(盗链)的方法小结
2016/11/11 PHP
使用onbeforeunload属性后的副作用
2007/03/08 Javascript
JavaScript基本编码模式小结
2012/05/23 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
2013/08/18 Javascript
nodejs获取本机内网和外网ip地址的实现代码
2014/06/01 NodeJs
js读取cookie方法总结
2014/10/31 Javascript
javascript实现网页字符定位的方法
2015/07/14 Javascript
jQuery实现Email邮箱地址自动补全功能代码
2015/11/03 Javascript
微信小程序(应用号)简单实例应用及实例详解
2016/09/26 Javascript
JavaScript Canvas绘制圆形时钟效果
2020/08/20 Javascript
JS实现标签页切换效果
2017/05/04 Javascript
浅谈JS如何实现真正的对象常量
2017/06/25 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
2020/03/26 Javascript
jquery实现简单拖拽效果
2020/07/20 jQuery
你不知道的 TypeScript 高级类型(小结)
2020/08/28 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
[03:28]2014DOTA2国际邀请赛 走近EG战队天才中单Arteezy
2014/07/12 DOTA
Python sqlite3事务处理方法实例分析
2017/06/19 Python
Django框架组成结构、基本概念与文件功能分析
2019/07/30 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
python 实现一个图形界面的汇率计算器
2020/11/09 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
Paradigit比利时电脑卖场:购买笔记本、电脑、平板和外围设备
2016/11/28 全球购物
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
英国网上购买门:Direct Doors
2018/06/07 全球购物
社会实践先进工作者事迹材料
2014/05/06 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
2014年党的群众路线学习心得体会
2014/11/05 职场文书
大学开学感言
2015/08/01 职场文书
Nginx配置https的实现
2021/11/27 Servers
Nginx反向代理、重定向
2022/04/13 Servers
win11开机发生死循环重启怎么办?win11开机发生死循环重启解决方法
2022/08/05 数码科技