php,oop;为可变深度的分类项目选择正确的设计模式,并显示项目的链接

时间:2015-09-16 17:04:19

标签: php algorithm oop design-patterns data-structures

简介

你好,

我想建立一个像这样的大数据结构:

[products]
   .[cat_1]
      .[cat_1.1]
         .[item-A] //type 1
         .[item-B] //type 1
         . ...
      .[cat_1.2]
         .[item-X] //type 2
   .[cat_2]
      .[item-Y] //type 3

到目前为止一切顺利。

目标

由于该网站应该是一种目录,因此URL将是:

www.example.com/products/cat_1/.../cat_Y/

该URL上的行为应该是:使用它的previewImage和指向example.com/products/cat_1/.../cat_Y/item-X的超链接显示所有子项(仅限项目或仅子组)。 物品类型当然是不同的。

我做了什么

我实现了基于Composite Pattern的结构,因此节点和leafs有一个共同的基类,在我的例子中,它保存了对象的名称。节点包含叶子或节点的数组,由一个名为addChild()的方法填充。

实施与此类似:

<?php
abstract class Base
{
    public $name;
    public $previewImage; //path to preview image

    public function __construct($name,$preview){
        $this->name=$name;
        $this->previewImage=$preview;
    }
}

class SubGroup extends Base{ 
    public $children= array();

    public function getChildrenByPath(Array $subGroupPath){ 
        //example: array("cat_1","cat_1-1",...);

        $subChildren=$this->children;

        foreach($subGroupPath as $currentPathStep){//follow subGroupPath
            foreach($subChildren as $currentChildr){// step through children and compare to path
                if($currentChild->uriPattern == $currentPathStep){                  
                    $subChildren=$currentChild->getChildren();
                    break; //end foreach
                }
            }
        }
        return $subChildren;
    }


    public function addChild(Base $new_child){
        $this->children[]=$new_child;
    }

    public function getChildren(){          
        return $this->children;
    }
}

class ProductType01 extends Base{
    public property1,property2,property3;
}
?>

对象/数据结构

我在一个单独的php文件中设置了一些项目来创建一个虚拟结构并试着玩(以后可以在数据库中):

$cat01 = new SubGroup("category 01","preview_cat_01.png");
$cat01->addChild( new ProductType01("Item-01","preview_01.png"));
$cat01->addChild( new ProductType01("Item-02","preview_02.png"));
...
$products = new subGroup("","","products"); //very first node
$products->addChild($cat01);

因此addChild()方法将项添加到第一个类的数组中。

演示

<main>
<?php
    $children=$products->getChildrenByPath($uri);
    foreach($children as $value){
        echo "<div class='previewImage_element'>";
        echo "<img src='".$value->previewImage."' style='width:calc(120px *4/3);height:calc(120px*3/4);'>";
        echo "<br /><a href='".."'>".$value->name."</a></div>\n";
    }
?>
</main>

这就是我在表结构中列出previewImages的方式,当然没问题。 这也可以作为一种方法自动化。

问题

我不知道复合材料(以及我构建它的方式)是否是正确的设计模式以及达到所需灵活性和易于实现结构的最佳方法。乍一看,复合模式似乎与我的分层数据相匹配,但要完成一个简单的实现,还有很多工作要做。

例如:如何构建项目的超链接,因为我无法向上移动树结构来收集上面的所有级别?

我不是在寻找一种“简单”的方法来设置类,而是轻松地使用

内部数组是采用它的方式还是有更复杂的方法指向子/子节点?

有了这种结构,你们将如何实现多语言功能?

以什么方式可以保持数据和HTML分开(尽可能多)?

这是一个好的开始方式吗?任何提示?任何帮助?批评非常受欢迎!!

1 个答案:

答案 0 :(得分:0)

您可以在Base类中添加父变量并将其设置在addChild中。检查null是必要的,但它允许您在树层次结构中移动两种方式。