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写的MySQL数据库用户认证系统代码
Mar 22 PHP
php设计模式 Bridge (桥接模式)
Jun 26 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
Aug 18 PHP
php判断GIF图片是否为动画的方法
Sep 04 PHP
ThinkPHP权限认证Auth实例详解
Jul 22 PHP
PHP遍历XML文档所有节点的方法
Mar 12 PHP
YII Framework教程之异常处理详解
Mar 14 PHP
Yii安装与使用Excel扩展的方法
Jul 13 PHP
PHP支付系统设计与典型案例分享
Aug 02 PHP
php 删除指定文件夹的实例讲解
Jul 25 PHP
利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解
Aug 30 PHP
PHP strripos函数用法总结
Feb 11 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使用Session和文件统计在线人数
2015/07/04 PHP
微信自定义菜单的创建/查询/取消php示例代码
2016/08/05 PHP
如何将JS的变量值传递给ASP变量
2012/12/10 Javascript
javascript面向对象特性代码实例
2014/06/12 Javascript
js数组去重的5种算法实现
2015/11/04 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
Vue.js第二天学习笔记(vue-router)
2016/12/01 Javascript
在javascript中,null>=0 为真,null==0却为假,null的值详解
2017/02/22 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
vue中动态select的使用方法示例
2019/10/28 Javascript
vue使用swiper.js重叠轮播组建样式
2019/11/14 Javascript
node 版本切换的实现
2020/02/02 Javascript
微信小程序实现限制用户转发功能的实例代码
2020/02/22 Javascript
js实现计算器功能
2020/08/10 Javascript
vue+iview使用树形控件的具体使用
2020/11/02 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
[01:12:53]完美世界DOTA2联赛PWL S2 Forest vs SZ 第一场 11.25
2020/11/26 DOTA
Python迭代和迭代器详解
2016/11/10 Python
用python实现的线程池实例代码
2018/01/06 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
python实现在多维数组中挑选符合条件的全部元素
2019/11/26 Python
Python 模拟动态产生字母验证码图片功能
2019/12/24 Python
python实现滑雪游戏
2020/02/22 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
2020/05/10 Python
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
.NET remoting中对象激活的两种方式
2015/06/08 面试题
企业总经理助理岗位职责
2014/09/12 职场文书
认错检讨书
2014/10/02 职场文书
全国爱眼日活动总结
2015/02/27 职场文书
圆明园观后感
2015/06/03 职场文书
士兵突击观后感
2015/06/16 职场文书
培训计划通知
2015/07/15 职场文书
孕妇病假条怎么写
2015/08/17 职场文书
golang switch语句的灵活写法介绍
2021/05/06 Golang
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js