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
Ajax+PHP快速上手及简单应用说明
Jul 24 PHP
PHP按行读取、处理较大CSV文件的代码实例
Apr 09 PHP
php实现按文件名搜索文件的远程文件查找器
May 10 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
Oct 15 PHP
PHP遍历目录函数opendir()、readdir()、closedir()、rewinddir()总结
Nov 18 PHP
4种PHP异步执行的常用方式
Dec 24 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
Jul 18 PHP
php mysql 封装类实例代码
Sep 18 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
Nov 15 PHP
yii2.0整合阿里云oss的示例代码
Sep 19 PHP
php用wangeditor3实现图片上传功能
Aug 22 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 define函数的使用说明
2008/08/27 PHP
php增删改查示例自己写的demo
2013/09/04 PHP
PHP中IP地址与整型数字互相转换详解
2014/08/20 PHP
php 调用百度sms来发送短信的实现示例
2018/11/02 PHP
php7 图形用户界面GUI 开发示例
2020/02/22 PHP
jQuery判断元素是否是隐藏的代码
2011/04/24 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
2013/12/31 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
jquery UI Datepicker时间控件的使用方法(基础版)
2015/11/07 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
Angular.js实现动态加载组件详解
2017/05/28 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
2018/04/04 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
js实现无缝轮播图
2020/03/09 Javascript
Python+微信接口实现运维报警
2016/08/27 Python
Ubuntu 下 vim 搭建python 环境 配置
2017/06/12 Python
解决python 输出是省略号的问题
2018/04/19 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
2018/04/20 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
简单了解python关系(比较)运算符
2019/07/08 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
Flask中sqlalchemy模块的实例用法
2020/08/02 Python
草莓网化妆品日本站:Strawberrynet日本
2017/10/20 全球购物
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
会计电算化专业毕业生推荐信
2013/12/24 职场文书
《假如》教学反思
2014/04/17 职场文书
关于环保的演讲稿
2014/05/10 职场文书
重阳节简报
2015/07/20 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
个人职业生涯规划之自我评估篇
2019/09/03 职场文书
Python基础之教你怎么在M1系统上使用pandas
2021/05/08 Python
CSS布局之浮动(float)和定位(position)属性的区别
2021/09/25 HTML / CSS
Win11安全功能升级:内置防网络钓鱼功能
2022/04/08 数码科技