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 相关文章推荐
用phpmyadmin更改mysql5.0登录密码
Mar 25 PHP
配置php网页显示各种语法错误
Sep 23 PHP
PHP验证码函数代码(简单实用)
Sep 29 PHP
封装ThinkPHP的一个文件上传方法实例
Oct 31 PHP
学习php设计模式 php实现原型模式(prototype)
Dec 07 PHP
PHP的Yii框架中使用数据库的配置和SQL操作实例教程
Mar 17 PHP
ThinkPHP的SAE开发相关注意事项详解
Oct 09 PHP
AES加解密在php接口请求过程中的应用示例
Oct 26 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
Dec 07 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
Aug 02 PHP
laravel获取不到session的三种解决办法【推荐】
Sep 16 PHP
实例分析PHP将字符串转换成数字的方法
Jan 27 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
晶体管单管来复再生式收音机
2021/03/02 无线电
php文件操作实例代码
2012/05/10 PHP
PHP递归算法的详细示例分析
2013/02/19 PHP
php调用shell的方法
2014/11/05 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
2016/11/09 PHP
php精度计算的问题解析
2019/06/21 PHP
在chrome浏览器中,防止input[text]和textarea在聚焦时出现黄色边框的解决方法
2011/05/24 Javascript
ExtJS下书写动态生成的xml(兼容火狐)
2013/04/02 Javascript
JavaScript中判断两个字符串是否相等的方法
2015/07/07 Javascript
JS实现的自定义右键菜单实例二则
2015/09/01 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
2016/11/25 Javascript
mui 打开新窗口的方式总结及注意事项
2017/08/20 Javascript
vue-router的两种模式的区别
2019/05/30 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
2019/10/16 jQuery
Layui实现主窗口和Iframe层参数传递
2019/11/14 Javascript
python快速查找算法应用实例
2014/09/26 Python
Python列表append和+的区别浅析
2015/02/02 Python
Python设计模式编程中解释器模式的简单程序示例分享
2016/03/02 Python
python编辑用户登入界面的实现代码
2018/07/16 Python
使用python生成杨辉三角形的示例代码
2018/08/29 Python
Python  Django 母版和继承解析
2019/08/09 Python
Python 使用 docopt 解析json参数文件过程讲解
2019/08/13 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
2020/03/06 Python
django之从html页面表单获取输入的数据实例
2020/03/16 Python
Python实现AI换脸功能
2020/04/10 Python
Python钉钉报警及Zabbix集成钉钉报警的示例代码
2020/08/17 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
CSS3新属性transition-property transform box-shadow实例学习
2013/06/06 HTML / CSS
基于CSS3实现的漂亮Menu菜单效果代码
2015/09/10 HTML / CSS
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
自我鉴定范文300字
2013/10/01 职场文书
读书小明星事迹材料
2014/05/03 职场文书
职务说明书范文
2014/05/07 职场文书
小学校长竞聘演讲稿
2014/05/16 职场文书
MySQL慢查询的坑
2021/04/28 MySQL
elementui的el-popover修改样式不生效的解决
2021/06/30 Javascript