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基础知识:控制结构
Dec 13 PHP
php jquery 实现新闻标签分类与无刷新分页
Dec 18 PHP
php读取excel文件的简单实例
Aug 26 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
Jan 26 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
Mar 05 PHP
Zend Framework教程之Application和Bootstrap用法详解
Mar 10 PHP
Smarty模板简单配置与使用方法示例
May 23 PHP
PHP GD库相关图像生成和处理函数小结
Sep 30 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
Mar 16 PHP
PHP实现数组的笛卡尔积运算示例
Dec 15 PHP
thinkphp5.1框架模板布局与模板继承用法分析
Jul 19 PHP
PHP代码加密的方法总结
Mar 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/07/06 PHP
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
javascript贪吃蛇完整版(源码)
2013/12/09 Javascript
jquery中get和post的简单实例
2014/02/04 Javascript
JS实现OCX控件的事件响应示例
2014/09/17 Javascript
JavaScript获取URL中参数querystring的方法详解
2016/10/11 Javascript
Bootstrap 3.x打印预览背景色与文字显示异常的解决
2016/11/06 Javascript
详解Vue SSR( Vue2 + Koa2 + Webpack4)配置指南
2018/11/13 Javascript
nodejs检测因特网是否断开的解决方案
2019/04/17 NodeJs
vue路由中前进后退的一些事儿
2019/05/18 Javascript
微信小程序利用Canvas绘制图片和竖排文字详解
2019/06/25 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
2019/09/16 Javascript
在vue中使用console.log无效的解决
2020/08/09 Javascript
详解vue-cli项目在IE浏览器打开报错解决方法
2020/12/10 Vue.js
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
Python模拟用户登录验证
2017/09/11 Python
Python中整数的缓存机制讲解
2019/02/16 Python
Django中ajax发送post请求 报403错误CSRF验证失败解决方案
2019/08/13 Python
基于Django signals 信号作用及用法详解
2020/03/28 Python
CSS3盒子模型详解
2013/04/24 HTML / CSS
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
计算机应用毕业生自荐信
2013/10/23 职场文书
求职自荐信格式
2013/12/04 职场文书
ktv总经理岗位职责
2014/02/17 职场文书
个人培训自我鉴定
2014/03/28 职场文书
老人祝寿主持词
2014/03/28 职场文书
三月学雷锋月活动总结
2014/04/28 职场文书
人力资源求职信
2014/05/25 职场文书
工会工作先进事迹
2014/08/18 职场文书
大学生作弊检讨书
2014/09/11 职场文书
2014年党员个人工作总结
2014/12/02 职场文书
银行先进个人总结
2015/02/15 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
解决Go gorm踩过的坑
2021/04/30 Golang
Java org.w3c.dom.Document 类方法引用报错
2021/08/07 Java/Android
SSM项目使用拦截器实现登录验证功能
2022/01/22 Java/Android