PHP設計模式之組合模式(Composite)程式碼例項大全(12)
阿新 • • 發佈:2020-09-14
目的
一組物件與該物件的單個例項的處理方式一致。
示例
-
form類的例項包含多個子元素,而它也像單個子元素那樣響應 render() 請求,當呼叫 render() 方法時,它會歷遍所有的子元素,呼叫 render() 方法
-
Zend_Config: 一個配置選項樹,每個選項自身就是一個 Zend_Config 物件
UML圖
程式碼
- RenderableInterface.php
<?php
namespace DesignPatterns\Structural\Composite;
interface RenderableInterface
{
public function render(): string;
}
- Form.php
<?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; } }
- InputElement.php
<?php
namespace DesignPatterns\Structural\Composite;
class InputElement implements RenderableInterface
{
public function render(): string
{
return '<input type="text" />';
}
}
- TextElement.php
<?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; } }
測試
- Tests/CompositeTest.php
<?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 成長指南+行業問題解決總綱(持續更新)
面試10家公司,收穫9個offer,2020年PHP 面試問題
★如果喜歡我的文章,想與更多資深開發者一起交流學習的話,獲取更多大廠面試相關技術諮詢和指導,歡迎加入我們的群啊,暗號:phpzh(群號碼856460874)。
內容不錯的話希望大家支援鼓勵下點個贊/喜歡,歡迎一起來交流;另外如果有什麼問題 建議 想看的內容可以在評論提出