>백엔드 개발 >PHP 튜토리얼 >PHP 조합 모드의 두 번째 구현 방법

PHP 조합 모드의 두 번째 구현 방법

黄舟
黄舟원래의
2017-03-15 09:45:281226검색

PHP결합 모드두 번째 구현 방법

<?php
// 组合模式

interface Component
{
	public function doAction();
	public function addComponent(Component $c);
	public function removeComponent(Component $c);
}

abstract class AbstractComponent
{
	// public abstract function doAction();

	/**
	 * default implementation
	 */
	public function addComponent(Component $c)
	{
		throw new Exception(&#39;This is leaf node, can\&#39;t be call addComponent method!&#39;);
	}

	/**
	 * default implementation
	 */
	public function removeComponent(Component $c)
	{
		throw new Exception(&#39;This is leaf node, can\&#39;t be call removeComponent method!&#39;);
	}
}

/**
 * 局部类
 * 可能并不需要 addComponent, removeComponent 方法,但是必须实现
 * 可以用抽象类作为超类(AbstractComponent),需要实现的覆盖即可,不需要实现的若调用则会发出异常。
 */
class Leaf implements Component
{
	public function doAction()
	{
		echoLine(&#39;The [leaf] doAction!&#39;);
	}

	/**
	 * null implementation
	 */
	public function addComponent(Component $c) { }

	/**
	 * null implementation
	 */
	public function removeComponent(Component $c) { }
}

/**
 * 组合模式的一个问题是如何实现 add 和 remove 方法。一般的组合模式会在抽象超类中添加 add
 * 和 remove 方法。这可以确保模式中的所有类都共享同一个借口,但这同时也意味着局部类也必须
 * 实现这些方法。实际上,我们并不希望在局部类中实现这些方法。
 *
 * 需要担心的问题:
 * 1. 组合操作的成本。
 * 2. 对象持久化问题。难以直接将数据保存在关系型数据中,但其数据却非常适合持久化为 XML。
 */
class Composite implements Component
{
	/**
	 * component container
	 */
	private $container = array();

	public function doAction()
	{
		echoLine(&#39;The [Composite] doAction!&#39;);
		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();

/**
 * 总结:
 *     如果你想像对待单个对象一样对待组合对象,那么组合模式十分有用。可能是因为组合对象本质上和局部对象
 * 相似,也可能因为在环境中组合对象和局部对象的特征相同。因为组合是树型结构,所以对整体的操作会影响
 * 到局部,而通过组合,对客户端代码来说局部的数据又是透明的。组合模式使这些操作和查询对客户端代码透明。
 * 对象树可以方便的进行遍历。你也可以轻松的在组合结构中加入新的组件类型。
 * 但另一方面,组合模式又依赖于其组成部分的简单性。随着我们引入复杂的规则,代码会变得越来越难以维护。
 * 组合模式不能很好的在关系型数据库中保存数据,但却非常适合使用 XML 持久化。
 */

위 내용은 PHP 조합 모드의 두 번째 구현 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.