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 相关文章推荐
如何去掉文章里的 html 语法
Oct 09 PHP
杏林同学录(六)
Oct 09 PHP
PHP逐行输出(ob_flush与flush的组合)
Feb 04 PHP
解析PHP自带的进位制之间的转换函数
Jun 08 PHP
linux下安装php的memcached客户端
Aug 03 PHP
PHP与MYSQL中UTF8编码的中文排序实例
Oct 21 PHP
php include类文件超时问题处理
Feb 06 PHP
PHP根据图片色界在不同位置加水印的方法
Jul 01 PHP
Yii2框架实现数据库常用操作总结
Feb 08 PHP
Yii框架实现多数据库配置和操作的方法
May 25 PHP
Laravel使用消息队列需要注意的一些问题
Dec 13 PHP
Laravel 5.5 实现禁用用户注册示例
Oct 24 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
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
php+ajax导入大数据时产生的问题处理
2014/06/11 PHP
CodeIgniter框架URL路由总结
2014/09/03 PHP
为你总结一些php信息函数
2015/10/21 PHP
php curl常用的5个经典例子
2017/01/20 PHP
De facto standard 世界上不可思议的事实标准
2010/08/29 Javascript
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
浅谈JS闭包中的循环绑定处理程序
2014/11/09 Javascript
jQuery实现的placeholder效果完整实例
2016/08/02 Javascript
微信小程序 解决swiper不显示图片的方法
2017/01/04 Javascript
JS开发中基本数据类型具体有哪几种
2017/10/19 Javascript
angularjs通过过滤器返回超链接的方法
2018/10/26 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
react实现复选框全选和反选组件效果
2020/08/25 Javascript
谈谈JavaScript令人迷惑的==与+
2020/08/31 Javascript
在vue项目中引用Antv G2,以饼图为例讲解
2020/10/28 Javascript
vue使用element-ui实现表单验证
2020/12/13 Vue.js
使用python调用浏览器并打开一个网址的例子
2014/06/05 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
Python实现读取TXT文件数据并存进内置数据库SQLite3的方法
2017/08/08 Python
python3.7 的新特性详解
2019/07/25 Python
Python基础之变量基本用法与进阶详解
2020/01/03 Python
pytorch实现mnist数据集的图像可视化及保存
2020/01/14 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
Linux Interview Questions For software testers
2012/06/02 面试题
个人自我评价和职业目标
2014/01/24 职场文书
2014年开学第一课活动方案
2014/03/06 职场文书
有兼职工作经历的简历自我评价
2014/03/07 职场文书
我的中国梦演讲稿800字
2014/08/19 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
刑事和解协议书范本
2014/11/19 职场文书
如何书写邀请函?
2019/06/24 职场文书
python小程序之飘落的银杏
2021/04/17 Python
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript
Python编写冷笑话生成器
2022/04/20 Python
Win10本地连接不见了怎么恢复? win10系统电脑本地连接不见了解决方法
2023/01/09 数码科技