<?php
// 设计思想:客户端可以一致性的操作整体和部分。
// php 技术群:781742505
declare(strict_types=1);
/**
* Interface Renderable
*/
interface Renderable
{
/**
* @return string
*/
public function render(): string;
}
/**
* Class InputElement
*/
class InputElement implements Renderable
{
/**
* @return string
*/
public function render(): string
{
return '<input type="text" />';
}
}
/**
* Class TextElement
*/
class TextElement implements Renderable
{
/**
* @var string
*/
private $text;
/**
* TextElement constructor.
*
* @param string $text
*/
public function __construct(string $text)
{
$this->text = $text;
}
/**
* @return string
*/
public function render(): string
{
return $this->text;
}
}
/**
* Class Form
*/
class Form implements Renderable
{
/**
* @var Renderable[]
*/
private $elements;
/**
* runs through all elements and calls render() on them, then returns the complete representation
* of the form.
*
* from the outside, one will not see this and the form will act like a single object instance
*
* @return string
*/
public function render(): string
{
$formCode = '<form>';
foreach ($this->elements as $element) {
$formCode .= $element->render();
}
$formCode .= '</form>';
return $formCode;
}
/**
* @param Renderable $element
*/
public function addElement(Renderable $element)
{
$this->elements[] = $element;
}
}
$form = new \Form();
$form->addElement(new \TextElement('Email:'));
$form->addElement(new \InputElement());
$embed = new \Form();
$embed->addElement(new \TextElement('Password:'));
$embed->addElement(new \InputElement());
$form->addElement($embed);
// '<form>Email:<input type="text" /><form>Password:<input type="text" /></form></form>'
echo $form->render();
组合模式
最新推荐文章于 2021-03-10 04:38:13 发布