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 转换字符串编码 iconv与mb_convert_encoding的区别说明
Nov 10 PHP
PHP导航下拉菜单的实现如此简单
Sep 22 PHP
本地计算机无法启动Apache故障处理
Aug 08 PHP
PHP基于CURL进行POST数据上传实例
Nov 10 PHP
php 把数字转换成汉字的代码
Jul 21 PHP
PHP表单数据写入MySQL数据库的代码
May 31 PHP
详解Laravel视图间共享数据与视图Composer
Aug 04 PHP
微信公众号开发客服接口实例代码
Oct 21 PHP
php 判断字符串编码是utf-8 或gb2312实例
Nov 01 PHP
利用switch语句进行多选一判断的实例代码
Nov 14 PHP
掌握PHP垃圾回收机制详解
Mar 13 PHP
php解决安全问题的方法实例
Sep 19 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
图形数字验证代码
2006/10/09 PHP
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
2012/03/07 PHP
PHP与MongoDB简介|安全|M+PHP应用实例详解
2013/06/17 PHP
php进行支付宝开发中return_url和notify_url的区别分析
2014/12/22 PHP
php在线解压ZIP文件的方法
2014/12/30 PHP
PHP获取二维数组中某一列的值集合
2015/12/25 PHP
WordPress后台中实现图片上传功能的实例讲解
2016/01/11 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
PHP获取对象属性的三种方法实例分析
2019/01/03 PHP
漂亮的提示信息(带箭头)
2007/03/21 Javascript
flexigrid 参数说明
2010/11/23 Javascript
js采用map取到id集合组并且实现点击一行选中一行
2013/12/16 Javascript
js操作输入框中选择内容兼容IE及其他主流浏览器
2014/04/22 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
详解js的异步编程技术的方法
2017/02/09 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
2017/10/24 Javascript
JavaScript实现快速排序的方法分析
2018/01/10 Javascript
vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀
2018/06/13 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
2018/06/25 Javascript
Nodejs中获取当前函数被调用的行数及文件名详解
2018/12/12 NodeJs
微信小程序实现多个按钮的颜色状态转换
2019/02/15 Javascript
Python cookbook(数据结构与算法)让字典保持有序的方法
2018/02/18 Python
numpy.meshgrid()理解(小结)
2019/08/01 Python
在macOS上搭建python环境的实现方法
2019/08/13 Python
python 的 openpyxl模块 读取 Excel文件的方法
2019/09/09 Python
np.random.seed() 的使用详解
2020/01/14 Python
美国办公用品购物网站:Quill.com
2016/09/01 全球购物
ALDI奥乐齐官方海外旗舰店:德国百年超市
2017/12/27 全球购物
幼儿园安全责任书范本
2014/07/24 职场文书
乡镇领导班子四风对照检查材料
2014/09/27 职场文书
公司授权委托书格式样本
2014/10/01 职场文书
停车场管理协议书范本
2014/10/08 职场文书
群众路线专项整治方案
2014/10/27 职场文书
八月迷情观后感
2015/06/11 职场文书
mysql创建存储过程及函数详解
2021/12/04 MySQL