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自动加载的两种实现方法
Jun 21 PHP
php join函数应用
May 04 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
Jun 17 PHP
php生成随机字符串可指定纯数字、纯字母或者混合的
Apr 18 PHP
php读取富文本的时p标签会出现红线是怎么回事
May 13 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
Apr 26 PHP
详谈php中 strtr 和 str_replace 的效率问题
May 14 PHP
iis6手工创建网站后无法运行php脚本的解决方法
Jun 08 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
Aug 01 PHP
thinkPHP通用控制器实现方法示例
Nov 23 PHP
PHP保留两位小数的几种方法
Jul 24 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 正确解码javascript中通过escape编码后的字符
2010/01/28 PHP
Yii框架连接mongodb数据库的代码
2016/07/27 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
Laravel框架实现调用百度翻译API功能示例
2019/05/30 PHP
用Javascript实现UTF8编码转换成gb2312编码
2006/12/22 Javascript
图片自动缩小 点击放大
2008/07/07 Javascript
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
利用js(jquery)操作Cookie的方法说明
2013/12/19 Javascript
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
点击页面任何位置隐藏div的实现方法
2016/09/05 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
利用nodeJs anywhere搭建本地服务器环境的方法
2018/05/12 NodeJs
详解Node.js amqplib 连接 Rabbit MQ最佳实践
2019/01/24 Javascript
小程序转发探索示例
2019/02/19 Javascript
Vue中的情侣属性$dispatch和$broadcast详解
2019/03/07 Javascript
JavaScript数组去重的几种方法
2019/04/07 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
快速解决layui弹窗按enter键不停弹窗的问题
2019/09/18 Javascript
Python算法输出1-9数组形成的结果为100的所有运算式
2017/11/03 Python
Python利用turtle库绘制彩虹代码示例
2017/12/20 Python
Python unittest单元测试框架总结
2018/09/08 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
python获取天气接口给指定微信好友发天气预报
2020/12/28 Python
python实现KNN近邻算法
2020/12/30 Python
HTML5 图片预加载的示例代码
2020/03/25 HTML / CSS
Servlet的生命周期
2013/08/25 面试题
进修护士自我鉴定
2013/10/14 职场文书
国贸专业个人求职信范文
2014/01/08 职场文书
歌颂党的演讲稿
2014/09/10 职场文书
晚会闭幕词
2015/01/28 职场文书
2015年度护士个人工作总结
2015/04/09 职场文书
2015年扶贫帮困工作总结
2015/05/20 职场文书
Pytorch 如何加速Dataloader提升数据读取速度
2021/05/28 Python
javascript对象3个属性特征
2021/11/17 Javascript