1. 什么是组合模式
组合模式(Composite Pattern)是一种将对象组合成树型结构以表示“整体-部分”关系的设计模式。组合模式使得用户对单个对象和组合对象的使用具有一致性。
组合模式包含三个角色:
Component(抽象构件):定义树叶节点和树枝节点的共同行为。
Leaf(树叶节点):表示叶子节点对象,叶子节点没有子节点。
Composite(树枝节点):表示含有子节点的节点对象,树枝节点可以有一个或多个子节点。
2. 组合模式的应用示例
2.1 场景描述
假设我们有一个文件系统,包含文件和文件夹。文件夹可以包含文件和其他文件夹,而文件是文件系统的最小单位,无法再包含其他文件或文件夹。
2.2 类结构
抽象构件(Component):
interface FileSystemComponent {
public function showDetails();
}
树叶节点(Leaf):
class File implements FileSystemComponent {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function showDetails() {
echo "File Name: " . $this->name . "\n";
}
}
树枝节点(Composite):
class Folder implements FileSystemComponent {
private $name;
private $components;
public function __construct($name) {
$this->name = $name;
$this->components = [];
}
public function addComponent(FileSystemComponent $component) {
$this->components[] = $component;
}
public function showDetails() {
echo "Folder Name: " . $this->name . "\n";
echo "Contents:\n";
foreach ($this->components as $component) {
$component->showDetails();
}
}
}
2.3 示例代码
$file1 = new File("file1.txt");
$file2 = new File("file2.txt");
$file3 = new File("file3.txt");
$folder1 = new Folder("Folder 1");
$folder2 = new Folder("Folder 2");
$folder3 = new Folder("Folder 3");
$folder1->addComponent($file1);
$folder1->addComponent($file2);
$folder2->addComponent($file3);
$folder3->addComponent($folder1);
$folder3->addComponent($folder2);
$folder3->showDetails();
2.4 示例代码输出
Folder Name: Folder 3
Contents:
Folder Name: Folder 1
Contents:
File Name: file1.txt
File Name: file2.txt
Folder Name: Folder 2
Contents:
File Name: file3.txt
3. 总结
组合模式在面对树形结构的数据时非常有用。通过使用组合模式,我们可以以统一的方式处理单个对象和组合对象,简化了对树形结构的操作。在示例中,我们展示了如何使用组合模式来构建一个文件系统的抽象和实现。