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 相关文章推荐
php日历[测试通过]
Mar 27 PHP
php中禁止单个IP与ip段访问的代码小结
Jul 04 PHP
如何实现php图片等比例缩放
Jul 28 PHP
yii2中添加验证码的实现方法
Jan 09 PHP
CodeIgniter 完美解决URL含有中文字符串
May 13 PHP
CI框架数据库查询之join用法分析
May 18 PHP
ThinkPHP使用getlist方法实现数据搜索功能示例
May 08 PHP
PHP单例模式与工厂模式详解
Aug 29 PHP
PHP的mysqli_stmt_init()函数讲解
Jan 24 PHP
PHP+mysql实现的三级联动菜单功能示例
Feb 15 PHP
使用SMB共享来绕过php远程文件包含的限制执行RFI的利用
May 31 PHP
PHP哈希表实现算法原理解析
Dec 11 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
PHP的魔术常量__METHOD__简介
2014/07/08 PHP
PHP针对多用户实现更换头像功能
2016/09/04 PHP
PHP设置images目录不充许http访问的方法
2016/11/01 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
jQuery 位置函数offset,innerWidth,innerHeight,outerWidth,outerHeight,scrollTop,scrollLeft
2010/03/23 Javascript
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
单元选择合并变色示例代码
2014/05/26 Javascript
JavaScript通过字典进行字符串翻译转换的方法
2015/03/19 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
浅谈JavaScript的内置对象和浏览器对象
2016/06/03 Javascript
jQuery 更改checkbox的状态,无效的解决方法
2016/07/22 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
详解jQuery中的isPlainObject()使用方法
2018/02/27 jQuery
vue中导出Excel表格的实现代码
2018/10/18 Javascript
小程序中英文混合排序问题解决
2019/08/02 Javascript
详解Vue中的自定义指令
2020/12/07 Vue.js
[01:45]绝对公平!DOTA2队长征召模式详解
2014/04/25 DOTA
用C++封装MySQL的API的教程
2015/05/06 Python
详解Python中 __get__和__getattr__和__getattribute__的区别
2016/06/16 Python
Python 中 Virtualenv 和 pip 的简单用法详解
2017/08/18 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
Python类的绑定方法和非绑定方法实例解析
2020/03/04 Python
windows下的pycharm安装及其设置中文菜单
2020/04/23 Python
Python如何将函数值赋给变量
2020/04/28 Python
详解css3 Transition属性(平滑过渡菜单栏案例)
2017/09/05 HTML / CSS
canvas画图被放大且模糊的解决方法
2020/08/11 HTML / CSS
教师研修随笔感言
2014/01/23 职场文书
优秀安全员事迹材料
2014/05/11 职场文书
五水共治一句话承诺
2014/05/30 职场文书
入党积极分子十八届四中全会思想汇报
2014/10/23 职场文书
四年级语文教学反思
2016/03/03 职场文书
2017年寒假少先队活动总结
2016/04/06 职场文书
2019新员工心得体会
2019/06/25 职场文书