一组对象与该对象的单个实例的处理方式一致。php
<?php namespace DesignPatterns\Structural\Composite; interface RenderableInterface { public function render(): string; }
<?php namespace DesignPatterns\Structural\Composite; /** * 该组合内的节点必须派生于该组件契约。为了构建成一个组件树, * 此为强制性操做。 */ class Form implements RenderableInterface { /** * @var RenderableInterface[] */ private $elements; /** * 遍历全部元素,并对他们调用 render() 方法,而后返回表单的完整 * 的解析表达。 * * 从外部上看,咱们不会看到遍历过程,该表单的操做过程与单一对 * 象实例同样 * * @return string */ public function render(): string { $formCode = '<form>'; foreach ($this->elements as $element) { $formCode .= $element->render(); } $formCode .= '</form>'; return $formCode; } /** * @param RenderableInterface $element */ public function addElement(RenderableInterface $element) { $this->elements[] = $element; } }
<?php namespace DesignPatterns\Structural\Composite; class InputElement implements RenderableInterface { public function render(): string { return '<input type="text" />'; } }
<?php namespace DesignPatterns\Structural\Composite; class TextElement implements RenderableInterface { /** * @var string */ private $text; public function __construct(string $text) { $this->text = $text; } public function render(): string { return $this->text; } }
<?php namespace DesignPatterns\Structural\Composite\Tests; use DesignPatterns\Structural\Composite; use PHPUnit\Framework\TestCase; class CompositeTest extends TestCase { public function testRender() { $form = new Composite\Form(); $form->addElement(new Composite\TextElement('Email:')); $form->addElement(new Composite\InputElement()); $embed = new Composite\Form(); $embed->addElement(new Composite\TextElement('Password:')); $embed->addElement(new Composite\InputElement()); $form->addElement($embed); // 此代码仅做示例。在实际场景中,如今的网页浏览器根本不支持 // 多表单嵌套,牢记该点很是重要 $this->assertEquals( '<form>Email:<input type="text" /><form>Password:<input type="text" /></form></form>', $form->render() ); } }
PHP 互联网架构师 50K 成长指南+行业问题解决总纲(持续更新)sql
面试10家公司,收获9个offer,2020年PHP 面试问题shell
★若是喜欢个人文章,想与更多资深开发者一块儿交流学习的话,获取更多大厂面试相关技术咨询和指导,欢迎加入咱们的群啊,暗号:phpzh(群号码856460874)。设计模式
内容不错的话但愿你们支持鼓励下点个赞/喜欢,欢迎一块儿来交流;另外若是有什么问题 建议 想看的内容能够在评论提出