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中在数据库中保存Checkbox数据(2)
Oct 09 PHP
mysql 的 like 问题,超强毕杀记!!!
Jan 18 PHP
PHP 彩色文字实现代码
Jun 29 PHP
PHP filter_var() 函数 Filter 函数
Apr 25 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(四)
Jun 23 PHP
php实现将数组转换为XML的方法
Mar 09 PHP
php简单实现快速排序的方法
Apr 04 PHP
php数组生成html下拉列表的方法
Jul 20 PHP
Symfony2在Nginx下的配置方法图文教程
Feb 04 PHP
利用php_imagick实现复古效果的方法
Oct 18 PHP
PHPExcel在linux环境下导出报500错误的解决方法
Jan 26 PHP
TP5框架实现一次选择多张图片并预览的方法示例
Apr 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
PHP 数据结构 算法 三元组 Triplet
2011/07/02 PHP
常用PHP框架功能对照表
2014/10/23 PHP
thinkphp整合微信支付代码分享
2016/11/24 PHP
js中设置元素class的三种方法小结
2011/08/28 Javascript
让alert不出现弹窗的两种方法
2014/05/18 Javascript
PHP实现的各种中文编码转换类分享
2015/01/23 Javascript
jQuery结合ajax实现动态加载文本内容
2015/05/19 Javascript
angular route中使用resolve在uglify压缩后问题解决
2016/09/21 Javascript
jQuery实现鼠标滑过预览图片大图效果的方法
2017/04/26 jQuery
详解JS获取HTML DOM元素的8种方法
2017/06/17 Javascript
微信小程序实现动态设置页面标题的方法【附源码下载】
2017/11/29 Javascript
vue中的watch监听数据变化及watch中各属性的详解
2018/09/11 Javascript
[03:20]次级联赛厮杀超职业 现超级兵对拆世纪大战
2014/10/30 DOTA
Django rest framework基本介绍与代码示例
2018/01/26 Python
Python Grid使用和布局详解
2018/06/30 Python
python3.6数独问题的解决
2019/01/21 Python
Django web框架使用url path name详解
2019/04/29 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
2019/07/07 Python
简单了解django处理跨域请求最佳解决方案
2020/03/25 Python
使用Python通过oBIX协议访问Niagara数据的示例
2020/12/04 Python
基于HTML5+tracking.js实现刷脸支付功能
2020/04/16 HTML / CSS
说一下Linux下有关用户和组管理的命令
2014/08/18 面试题
商务英语专业应届毕业生求职信
2013/10/28 职场文书
应届大学毕业生找工作的求职信范文
2013/11/29 职场文书
历史教育专业个人求职信
2013/12/13 职场文书
房产销售经理职责
2013/12/20 职场文书
服务生自我鉴定
2014/01/22 职场文书
建筑系毕业生自我鉴定
2014/01/24 职场文书
2015年少先队活动总结
2015/03/25 职场文书
让世界充满爱观后感
2015/06/10 职场文书
小学安全教育主题班会
2015/08/12 职场文书
2016年五一劳动节专题校园广播稿
2015/12/17 职场文书
请假条应该怎么写?
2019/06/24 职场文书
Python中OpenCV实现简单车牌字符切割
2021/06/11 Python
python编程学习使用管道Pipe编写优化代码
2021/11/20 Python
Android实现获取短信验证码并自动填充
2023/05/21 Java/Android