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的FTP学习(一)
Oct 09 PHP
php curl 登录163邮箱并抓取邮箱好友列表的代码(经测试)
Apr 07 PHP
php模拟ping命令(php exec函数的使用方法)
Oct 25 PHP
让codeigniter与swfupload整合的最佳解决方案
Jun 12 PHP
php防止伪造数据从地址栏URL提交的方法
Aug 24 PHP
Yii框架关联查询with用法分析
Dec 02 PHP
php实现递归抓取网页类实例
Apr 03 PHP
php微信公众平台开发(三)订阅事件处理
Dec 06 PHP
PHP简单实现合并2个数字键数组值的方法
May 30 PHP
PHP实现微信图片上传到服务器的方法示例
Jun 29 PHP
Laravel-admin之修改操作日志的方法
Sep 30 PHP
Laravel 修改默认日志文件名称和位置的例子
Oct 17 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
第1次亲密接触PHP5(2)
2006/10/09 PHP
Yii2分页的使用及其扩展方法详解
2016/05/23 PHP
Ajax+PHP实现的删除数据功能示例
2019/02/12 PHP
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
JQuery学习笔记 nt-child的使用
2011/01/17 Javascript
基于jQuery的投票系统显示结果插件
2011/08/12 Javascript
JS中Iframe之间传值的方法
2013/03/11 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
2013/09/23 Javascript
js 动态加载事件的几种方法总结
2013/12/25 Javascript
JavaScript鼠标事件,点击鼠标右键,弹出div的简单实例
2016/08/03 Javascript
js判断PC端与移动端跳转
2020/12/24 Javascript
浅谈ES6新增的数组方法和对象
2017/08/08 Javascript
利用Blob进行文件上传的完整步骤
2018/08/02 Javascript
JS实现方形抽奖效果
2018/08/27 Javascript
用Vue.js方法创建模板并使用多个模板合成
2019/06/28 Javascript
jQuery利用cookie 实现本地收藏功能(不重复无需多次命名)
2019/11/07 jQuery
Vue状态模式实现窗口停靠功能(灵动、自由, 管理后台Admin界面)
2020/03/06 Javascript
vue中v-for循环选中点击的元素并对该元素添加样式操作
2020/07/17 Javascript
解决vue 退出动画无效的问题
2020/08/09 Javascript
Python ljust rjust center输出
2008/09/06 Python
Python中MYSQLdb出现乱码的解决方法
2014/10/11 Python
Python的设计模式编程入门指南
2015/04/02 Python
python中的turtle库函数简单使用教程
2018/07/23 Python
自定义django admin model表单提交的例子
2019/08/23 Python
python 发送get请求接口详解
2020/11/17 Python
python palywright库基本使用
2021/01/21 Python
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
劳动模范事迹材料
2014/01/19 职场文书
应聘医药销售自荐书范文
2014/02/08 职场文书
审计局2014法制宣传日活动总结
2014/11/01 职场文书
辞职信标准格式
2015/02/27 职场文书
停电通知范文
2015/04/16 职场文书
当幸福来敲门观后感
2015/06/01 职场文书
win10清理dns缓存
2022/04/19 数码科技