您的位置:首页 > 其它

组合模式实现方式一

2017-02-22 15:49 190 查看
<?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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  组合模式