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 相关文章推荐
ZF等常用php框架中存在的问题
Jan 10 PHP
Mysql中limit的用法方法详解与注意事项
Apr 19 PHP
php header Content-Type类型小结
Jul 03 PHP
深入PHP FTP类的详解
Jun 13 PHP
php递归json类实例
Dec 02 PHP
PHP实现事件机制实例分析
Jun 26 PHP
Yii2简单实现多语言配置的方法
Jul 23 PHP
PDO的安全处理与事物处理方法
Oct 31 PHP
PHP+iframe图片上传实现即时刷新效果
Nov 18 PHP
PHP laravel中的多对多关系实例详解
Jun 07 PHP
PHP守护进程化在C和PHP环境下的实现
Nov 21 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
Feb 13 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中的使用情况
2015/11/05 PHP
PHP实现接收二进制流转换成图片的方法
2017/01/10 PHP
Laravel 5.1 框架Blade模板引擎用法实例分析
2020/01/04 PHP
网页自动刷新,不产生嗒嗒声的一个解决方法
2007/03/27 Javascript
jquery Tab效果和动态加载的简单实例
2013/12/11 Javascript
jQuery中操控hidden、disable等无值属性的方法
2014/01/06 Javascript
浅析javascript中function 的 length 属性
2014/05/27 Javascript
原创jQuery弹出层插件分享
2015/04/02 Javascript
JQuery日历插件My97DatePicker日期范围限制
2016/01/20 Javascript
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
ionic隐藏tabs的方法
2016/08/29 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
2016/09/20 Javascript
JS验证图片格式和大小并预览的简单实例
2016/10/11 Javascript
node.js入门教程之querystring模块的使用方法
2017/02/27 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
ES6使用Set数据结构实现数组的交集、并集、差集功能示例
2017/10/31 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
详解webpack模块化管理和打包工具
2018/04/21 Javascript
使用nodejs分离html文件里的js和css详解
2019/04/12 NodeJs
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
Python工程师面试题 与Python Web相关
2016/01/14 Python
使用python为mysql实现restful接口
2018/01/05 Python
python的staticmethod与classmethod实现实例代码
2018/02/11 Python
python-opencv颜色提取分割方法
2018/12/08 Python
用vue.js组件模拟v-model指令实例方法
2019/07/05 Python
Python 实现PS滤镜的旋涡特效
2020/12/03 Python
html5 Canvas画图教程(2)—画直线与设置线条的样式如颜色/端点/交汇点
2013/01/09 HTML / CSS
美国女孩洋娃娃店:American Girl
2017/10/24 全球购物
Luxplus瑞典:香水和美容护理折扣
2018/01/28 全球购物
安全事故检讨书
2014/01/18 职场文书
七一党建活动方案
2014/01/28 职场文书
关于安全的标语
2014/06/10 职场文书
超市创意活动方案
2014/08/15 职场文书
2016公司新年问候语
2015/11/11 职场文书
Java基础之详解HashSet的使用方法
2021/06/30 Java/Android