php设计模式之中介者模式分析【星际争霸游戏案例】

 更新时间:2020年03月23日 08:38:20   作者:DavidHHuan  
这篇文章主要介绍了php设计模式之中介者模式,结合具体案例形式分析了星际争霸游戏中使用PHP中介者模式的相关操作技巧,需要的朋友可以参考下

本文实例讲述了php设计模式之中介者模式。分享给大家供大家参考,具体如下:

星际的升级系统做得比较平衡,不过由于不少兵种和建筑的制造都需要有相关的科技建筑,所以关系比较复杂。
比如一个科学站造出来后,所有的飞机场都可以建造科技球了,但是一旦一个科学站被摧毁,就要看是否还有科学站,否则就得让所有的飞机场都不能造科技球。
我们可以用上次说的观察者模式解决问题,不过由于星际里面的升级相关比较多,似乎比较麻烦。
其实从实质来讲,任何升级一般只要知道某种建筑是否存在就行了,因此我们不必让他们多对多联系,设置一个中介者就行了。
这就好像我们不管买什么东西,到超市就可以了,而厂家也只要和超市联系,不必和我们每个消费者直接接触。

待解决的问题:不要让各个建筑互相联系,减少复杂程度。

思路:设置中介者,每次遇到制造科技相关的东西,询问中介者。

中介者(Mediator)模式示例:

<?php
  //中介者
  class Mediator
  {
    //存放科技建筑的数量,为了简单说明,用静态属性,其实也可以让各个对象来处理
    public static $techBuilding;
    //根据参数$techBuildingName代表的建筑名称,返回是否存在相应的科技建筑,为了简单说明,用静态属性
    public static function isTechAllow ($techBuildingName)
    {
      //如果科技建筑数量大于零,就返回true,否则返回false
      return self::$techBuilding[$techBuildingName]>0;
    }
    //一旦科技建筑造好了或者被摧毁,调用这个方法,参数$techBuildingName代表建筑名称,$add为布尔值,true表示增加(建造),false代表减少(摧毁)
    public static function changeTech ($techBuildingName, $add)
    {
      //建造
      if ($add)
      {
        //增加数量
        self::$techBuilding[$techBuildingName]++;
      }
      else
      {
        //减少数量
        self::$techBuilding[$techBuildingName]--;
      }
    }
  }
  //科技站类
  class ScienceFacility
  {
    //构造方法
    public function __construct()
    {
      Mediator::changeTech('ScienceFacility', true);
    }
    //析构方法
    public function __destruct()
    {
      Mediator::changeTech('ScienceFacility', false);
    }
  }
  //飞机场类
  class Starport
  {
    //制造科技球的方法
    public function createScienceVessel ()
    {
      //询问中介者,决定是否能制造科技球
      echo Mediator::isTechAllow('ScienceFacility') ? '可以制造科技球' : '不能制造科技球';
    }
  }
  //造一个科技站
  $scienceFacility1 = new ScienceFacility();
  //再造一个科技站
  $scienceFacility2 = new ScienceFacility();
  //造一个飞机场
  $starport = new Starport();
  //建造科技球,结果是能够
  $starport->createScienceVessel();
  echo "<br/>";
  //一个科技站被摧毁
  unset($scienceFacility1);
  //这时建造科技球,结果是能够,因为还有一个科技站
  $starport->createScienceVessel();
  echo "<br/>";
  //另一个科技站被摧毁
  unset($scienceFacility2);
  //这时建造科技球,结果是不行
  $starport->createScienceVessel();
?>

运行结果:

可以制造科技球
可以制造科技球
不能制造科技球

用途总结:中介者模式可以减少各个对象的通讯,避免代码相互关联。

实现总结:中介者模式比较灵活,一般只要有中介者类和需要被协调的类,具体设计看遇到的问题。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总

希望本文所述对大家PHP程序设计有所帮助。

相关文章

  • PHP生成json和xml类型接口数据格式

    PHP生成json和xml类型接口数据格式

    在做数据接口时,我们通常要获取第三方数据接口或者给第三方提供数据接口,而这些数据格式通常是以XML或者JSON格式传输,本文将介绍如何使用PHP生成XML格式数据供第三方调用以及如何获取第三方提供的XML数据。
    2015-05-05
  • Zend Framework前端控制器用法示例

    Zend Framework前端控制器用法示例

    这篇文章主要介绍了Zend Framework前端控制器用法,结合实例形式分析了Zend Framework前端控制器的常用方法与相关使用技巧,需要的朋友可以参考下
    2016-12-12
  • CI框架扩展系统核心类的方法分析

    CI框架扩展系统核心类的方法分析

    这篇文章主要介绍了CI框架扩展系统核心类的方法,结合实例形式分析了CI框架实现扩展系统核心类的步骤与相关操作技巧,需要的朋友可以参考下
    2016-05-05
  • 正确的PHP匹配UTF-8中文的正则表达式

    正确的PHP匹配UTF-8中文的正则表达式

    这篇文章主要介绍了正确的PHP匹配UTF-8中文的正则表达式,本文对比给出了两个不同的正则表达式,需要的朋友可以参考下
    2015-05-05
  • 一个非常完美的读写ini格式的PHP配置类分享

    一个非常完美的读写ini格式的PHP配置类分享

    这篇文章主要介绍了一个非常完美的读写ini格式的PHP配置类分享,本文给出类代码、使用例子和配置文件例子,需要的朋友可以参考下
    2015-02-02
  • 常用PHP封装分页工具类

    常用PHP封装分页工具类

    这篇文章主要为大家详细介绍了常用PHP封装分页工具类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • php 问卷调查结果统计

    php 问卷调查结果统计

    一个新产品投入市场,要先做问卷调查,考察这个产品在市场的需求量,本篇文章主要跟大家介绍使用php问卷调查结果统计,感兴趣的朋友一起学习吧
    2015-10-10
  • 浅谈thinkphp5 instance 的简单实现

    浅谈thinkphp5 instance 的简单实现

    本篇文章主要介绍了浅谈thinkphp5 instance 的简单实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • PHP小教程之实现双向链表

    PHP小教程之实现双向链表

    双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
    2014-06-06
  • php读取csv实现csv文件下载功能

    php读取csv实现csv文件下载功能

    用PHP代码下载CSV文件,可以是字符串,也可以是一个CSV文件,下面直接上代码
    2013-12-12

最新评论