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


Posted in PHP onMarch 23, 2020

本文实例讲述了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分页类的代码
May 18 PHP
php cc攻击代码与防范方法
Oct 18 PHP
解决CodeIgniter伪静态失效
Jun 09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(六)
Jun 23 PHP
PHP语法自动检查的Vim插件
Aug 11 PHP
php实现的用户查询类实例
Jun 18 PHP
PHP实现长文章分页实例代码(附源码)
Feb 03 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
Aug 19 PHP
PHP7新特性foreach 修改示例介绍
Aug 26 PHP
PHP图片水印类的封装
Jul 06 PHP
PHP基于SimpleXML生成和解析xml的方法示例
Jul 17 PHP
php 中的信号处理操作实例详解
Mar 04 PHP
PDO实现学生管理系统
Mar 21 #PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
Mar 18 #PHP
YII2框架使用控制台命令的方法分析
Mar 18 #PHP
YII2框架中添加自定义模块的方法实例分析
Mar 18 #PHP
YII2框架中日志的配置与使用方法实例分析
Mar 18 #PHP
YII2框架中查询生成器Query()的使用方法示例
Mar 18 #PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
Mar 18 #PHP
You might like
CodeIgniter生成静态页的方法
2016/05/17 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
用JQuery 实现的自定义对话框
2007/03/24 Javascript
JavaScript Undefined,Null类型和NaN值区别
2008/10/22 Javascript
JS 事件绑定函数代码
2010/04/28 Javascript
40个有创意的jQuery图片和内容滑动及弹出插件收藏集之三
2012/01/03 Javascript
jquery 插件学习(六)
2012/08/06 Javascript
js整数字符串转换为金额类型数据(示例代码)
2013/12/26 Javascript
js 触发select onchange事件代码
2014/03/20 Javascript
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
2014/12/05 Javascript
node.js中的fs.readFileSync方法使用说明
2014/12/15 Javascript
javascript实现禁止复制网页内容汇总
2015/12/30 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
前端程序员必须知道的高性能Javascript知识
2016/08/24 Javascript
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
node.js操作MongoDB的实例详解
2017/10/11 Javascript
利用Node.js如何实现文件循环覆写
2019/04/05 Javascript
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
2020/01/05 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
2020/06/05 Javascript
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
python 实现多维数组转向量
2019/11/30 Python
深入了解如何基于Python读写Kafka
2019/12/31 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
Spring @Enable模块驱动原理及使用实例
2020/06/23 Python
阿玛尼化妆品美国官网:Giorgio Armani Beauty
2017/02/02 全球购物
Fanatics法国官网:美国体育电商
2019/08/27 全球购物
教师申诉制度
2014/01/29 职场文书
共产党员公开承诺书范文
2014/03/28 职场文书
民族团结好少年事迹材料
2014/08/19 职场文书
个人股份转让协议书范本
2014/10/26 职场文书
2019年最新感恩节祝福语(28句)
2019/11/27 职场文书
Django对接elasticsearch实现全文检索的示例代码
2021/08/02 Python
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
2022/04/12 MySQL