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 中的类
Oct 09 PHP
PHP安全配置
Oct 09 PHP
php xfocus防注入资料
Apr 27 PHP
php数据结构 算法(PHP描述) 简单选择排序 simple selection sort
Aug 09 PHP
php 无法加载mysql的module的时候的配置的解决方案引发的思考
Jan 27 PHP
php函数连续调用实例分析
Jul 30 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
Dec 08 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
May 13 PHP
php通过执行CutyCapt命令实现网页截图的方法
Sep 30 PHP
thinkPHP模板引擎用法示例
Dec 08 PHP
CI框架实现优化文件上传及多文件上传的方法
Jan 04 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
Oct 14 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
用PHP编程开发“虚拟域名”系统
2006/10/09 PHP
PHP 反射机制实现动态代理的代码
2008/10/22 PHP
PHP 显示客户端IP与服务器IP的代码
2010/10/12 PHP
PHP资源管理框架Assetic简介
2014/06/12 PHP
SESSION存放在数据库用法实例
2015/08/08 PHP
PHP删除数组中指定下标的元素方法
2018/02/03 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
JS加ASP二级域名转向的代码
2007/05/17 Javascript
基于Jquery的跨域传输数据(JSONP)
2011/03/10 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
JavaScript实现复制功能各浏览器支持情况实测
2013/07/18 Javascript
用box固定长宽实现图片自动轮播js代码
2014/06/09 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
利用JS生成博文目录及CSS定制博客
2016/02/10 Javascript
angular中使用Socket.io实例代码
2017/06/03 Javascript
Node.js使用gm拼装sprite图片
2017/07/04 Javascript
Javascript中从学习bind到实现bind的过程
2018/01/05 Javascript
Node.js如何对SQLite的async/await封装详解
2019/02/14 Javascript
微信小程序如何刷新当前界面的实现方法
2019/06/07 Javascript
vue通过数据过滤实现表格合并
2020/11/30 Javascript
JavaScript对象字面量和构造函数原理与用法详解
2020/04/18 Javascript
vue或react项目生产环境去掉console.log的操作
2020/09/02 Javascript
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
python实现给scatter设置颜色渐变条colorbar的方法
2018/12/13 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
Python map及filter函数使用方法解析
2020/08/06 Python
JSF面试题:Jsf中的核心类用那些?有什么作用?LiftCycle六大生命周期是什么?
2014/07/17 面试题
平面设计师的工作职责
2013/11/21 职场文书
研究生毕业自我鉴定范文
2014/03/27 职场文书
保险内勤岗位职责
2014/04/05 职场文书
单位委托书怎么写
2014/08/02 职场文书
2015年电话客服工作总结
2015/05/18 职场文书
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技