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 相关文章推荐
简单的过滤字符串中的HTML标记
Dec 25 PHP
php面向对象全攻略 (七) 继承性
Sep 30 PHP
PHP 图片文件上传实现代码
Dec 29 PHP
批量去除PHP文件中bom的PHP代码
Mar 13 PHP
PHP字符串的编码问题的详细介绍
Apr 27 PHP
Win7下手动安装apache2.2、php5.4笔记
Apr 03 PHP
ThinkPHP V2.2说明文档没有说明的那些事实例小结
Jul 01 PHP
CodeIgniter针对数据库的连接、配置及使用方法
Mar 03 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
Jul 12 PHP
PHP+Ajax无刷新带进度条图片上传示例
Feb 08 PHP
在php7中MongoDB实现模糊查询的方法详解
May 03 PHP
PHP中的self关键字详解
Jun 23 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
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
php函数传值的引用传递注意事项分析
2016/06/25 PHP
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
JS实现简单的Canvas画图实例
2013/07/04 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
JavaScript判断浏览器及其版本信息
2017/01/20 Javascript
js实现图片左右滚动效果
2017/02/27 Javascript
整理关于Bootstrap列表组的慕课笔记
2017/03/29 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
小程序接口的promise化的实现方法
2019/12/11 Javascript
React 实现车牌键盘的示例代码
2019/12/20 Javascript
Vue解析剪切板图片并实现发送功能
2020/02/04 Javascript
[01:38]女王驾到——至宝魔廷新尊技能&特效展示
2020/06/16 DOTA
Python 字符串定义
2009/09/25 Python
python中使用urllib2获取http请求状态码的代码例子
2014/07/07 Python
python实现TCP服务器端与客户端的方法详解
2015/04/30 Python
python中string模块各属性以及函数的用法介绍
2016/05/30 Python
python编写朴素贝叶斯用于文本分类
2017/12/21 Python
python 读取文件并替换字段的实例
2018/07/12 Python
把JSON数据格式转换为Python的类对象方法详解(两种方法)
2019/06/04 Python
Python 获取 datax 执行结果保存到数据库的方法
2019/07/11 Python
Pytorch DataLoader 变长数据处理方式
2020/01/08 Python
利用python汇总统计多张Excel
2020/09/22 Python
中国专业的音频分享平台:喜马拉雅
2019/05/24 全球购物
思想政治自我鉴定
2013/10/06 职场文书
管理站站长岗位职责
2013/11/27 职场文书
公司庆典邀请函范文
2014/01/13 职场文书
初中校园广播稿
2014/02/02 职场文书
小学生评语大全
2014/04/18 职场文书
小学生国旗下演讲稿
2014/04/25 职场文书
实践单位评语
2014/04/26 职场文书
大学生社会实践活动总结报告
2015/05/06 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
使用Redis实现分布式锁的方法
2022/06/16 Redis