<?php
// 组合模式
function echoLine($msg) {
echo $smg, '<br/>';
}
interface Component
{
public function doAction();
}
/**
* 局部类
*/
class Leaf implements Component
{
public function doAction()
{
echoLine('The [leaf] doAction!');
}
}
/**
* 组合模式的一个问题是如何实现 add 和 remove 方法。一般的组合模式会在抽象超类中添加 add
* 和 remove 方法。这可以确保模式中的所有类都共享同一个借口,但这同时也意味着局部类也必须
* 实现这些方法。实际上,我们并不希望在局部类中实现这些方法。
*
* 需要担心的问题:
* 1. 组合操作的成本。
* 2. 对象持久化问题。难以直接将数据保存在关系型数据中,但其数据却非常适合持久化为 XML。
*/
class Composite implements Component
{
/**
* component container
*/
private $container = array();
public function doAction()
{
echoLine('The [Composite] doAction!');
foreach ($this->container as $c)
$c->doAction();
}
/**
* add component
* @param Component $c
*/
public function addComponent(Component $c)
{
if(!in_array($c, $this->container, true))
$this->container[] = $c;
}
/**
* remove conponent
* @param Component $c
*/
public function removeComponent(Component $c)
{
$this->container = array_diff($this->container, array($c));
}
/**
* get all components
* @return array
*/
public function getComponents()
{
return $this->container;
}
}
// test code
$leaf = new Leaf();
$composite = new Composite();
$composite->addComponent($leaf);
$composite->addComponent(new Leaf());
$composite->addComponent(new Leaf());
$composite->doAction();
组合模式实现方式一
最新推荐文章于 2023-04-27 15:37:45 发布