php设计模式之组合模式实例详解【星际争霸游戏案例】


Posted in PHP onMarch 27, 2020

本文实例讲述了php设计模式之组合模式。分享给大家供大家参考,具体如下:

星际里面我们可以下载别人制作的地图,或者自己做地图玩。

我们在选择玩哪张地图的时候,可以看到游戏列出当前地图包里面的地图或地图包的名字。

虽然地图和地图包是通过文件和文件夹区分的,但是我们开发的时候,总希望能使用对象来进行抽象。

那么对于地图和地图包这两个相关的对象,我们能不能简化他们之间的区别呢?

待解决的问题:尽量是调用这两种对象的代码一致,也就是说很多场合不必区分到底是地图还是地图包。

思路:我们做一个抽象类,让地图类和地图包类继承它,这样类的很多方法的名称一样。

组合(Composite)模式示例:

<?php
  //抽象地图类
  abstract class abstractMap
  {
    //地图或地图包的名称
    public $name;

    //构造方法
    public function __construct($name)
    {
      $this->name = $name;
    }

    //地图或地图包的名称,地图对象没有子对象,所以用空函数,直接继承
    public function getChildren(){}

    //添加子对象,地图对象没有子对象,所以用空函数,直接继承
    public function addChild(abstractMap $child){}

    //显示地图或地图包的名称
    public function showMapName()
    {
      echo $this->name.”<br>”;
    }

    //显示子对象,地图对象没有子对象,所以用空函数,直接继承
    public function showChildren(){}
  }

  //地图类,继承抽象地图,这里面我们暂且使用抽象地图的方法
  class Map extends abstractMap
  {

  }

  //地图包类,继承抽象地图,这里面我们就需要重载抽象地图的方法
  class MapBag extends abstractMap
  {

    //子对象的集合
    public $childern;

    //添加子对象,强制用abstractMap对象,当然地图和地图包由于继承了abstractMap,所以也是abstractMap对象
    public function addChild(abstractMap $child)
    {
      $this->childern[] = $child;
    }

    //添加子对象
    public function function showChildren()
    {
      if (count($this->childern)>0)
      {
        foreach ($this->childern as $child)
        {
          //调用地图或包的名称
          $child->showMapName();
        }
      }
    }
  }

  //新建一个地图包对象,假设文件夹名字为Allied,这个大家可以看看星际的地图目录,真实存在的
  $map1 = new MapBag(‘Allied');

  //新建一个地图对象,假设文件名字为(2)Fire Walker(也是真实的)
  $map2 = new Map(‘(2)Fire Walker');

  //接下去可以看到组合模式的特点和用处。

  //假设后面的代码需要操作两个对象,而我们假设并不清楚这两个对象谁是地图,谁是地图包

  //给$map1添加一个它的子对象,是个地图,(4)The Gardens
  $map1->addChild(new Map(‘(4)The Gardens'));

  //展示它的子对象
  $map1->showChildren();

  //给$map2添加一个它的子对象,是个地图,(2)Fire Walker,这里不会报错,因为地图继承了一个空的添加方法
  $map2->addChild(new Map(‘(2)Fire Walker'));

  //展示它的子对象,也不会出错,因为地图继承了一个空的展示方法
  $map2->showChildren();

?>

用途总结:组合模式可以对容器和物体(这里的地图包和地图)统一处理,其他代码处理这些对象的时候,不必过于追究谁是容器,谁是物体。这里为了简化说明,没有深入探讨,其实组合模式常常用于和迭代模式结合,比如我们可以用统一的方法(就像这里的showChildren方法),获取地图包下所有的地图名(包括子目录)

实现总结:用一个基类实现一些容器和物体共用的方法,比如上面的abstractMap,然后让容器和物体类继承基类。由于各自的特性不同,在容器和物体类中重载相应的方法,比如addChild方法。这样对外就可以用统一的方法操作这两种对象。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
mysql 的 like 问题,超强毕杀记!!!
Jan 18 PHP
PHP 替换模板变量实现步骤
Aug 24 PHP
PHP 数组排序方法总结 推荐收藏
Jun 30 PHP
php上传文件的增强函数
Jul 21 PHP
php设计模式 Interpreter(解释器模式)
Jun 26 PHP
php的urlencode()URL编码函数浅析
Aug 09 PHP
PHP详解ASCII码对照表与字符转换
Dec 05 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
Jul 22 PHP
php eval函数一句话木马代码
May 21 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
Nov 12 PHP
php生成复杂验证码(倾斜,正弦干扰线,黏贴,旋转)
Mar 12 PHP
php实现微信模板消息推送
Mar 30 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
Mar 26 #PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
Mar 26 #PHP
Centos7安装swoole扩展操作示例
Mar 26 #PHP
PHP开发api接口安全验证操作实例详解
Mar 26 #PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 #PHP
php中加密解密DES类的简单使用方法示例
Mar 26 #PHP
TP5框架使用QueryList采集框架爬小说操作示例
Mar 26 #PHP
You might like
关于PHPDocument 代码注释规范的总结
2013/06/25 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
纯JAVASCRIPT图表动画插件Highcharts Examples
2011/04/16 Javascript
js切换div css注意的细节
2012/12/10 Javascript
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
checkbox全选所涉及到的知识点介绍
2013/12/31 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
父页面显示遮罩层弹出半透明状态的dialog
2014/03/04 Javascript
node.js实现BigPipe详解
2014/12/05 Javascript
JavaScript框架是什么?怎样才能叫做框架?
2015/07/01 Javascript
ionic隐藏tabs的方法
2016/08/29 Javascript
React.js中常用的ES6写法总结(推荐)
2017/05/09 Javascript
jQuery实现的表格前端排序功能示例
2017/09/18 jQuery
用jquery获取select标签中选中的option值及文本的示例
2018/01/25 jQuery
layui radio性别单选框赋值方法
2018/08/15 Javascript
微信小程序云函数使用mysql数据库过程详解
2019/08/07 Javascript
原生JS无缝滑动轮播图
2019/10/22 Javascript
Vue项目打包编译优化方案
2020/09/16 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
vue前端和Django后端如何查询一定时间段内的数据
2021/02/28 Vue.js
[02:27]2014DOTA2国际邀请赛 VG赛后采访:更大的挑战在等着我们
2014/07/13 DOTA
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
python删除不需要的python文件方法
2018/04/24 Python
Python监控服务器实用工具psutil使用解析
2019/12/19 Python
python 检测nginx服务邮件报警的脚本
2020/12/31 Python
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
啤酒节策划方案
2014/05/28 职场文书
新郎新娘致辞
2015/07/31 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python