php设计模式 装饰器模式,php设计模式
装饰器模式,可以动态地添加修改类的功能。
一个类提供了一项功能,如果要修改并添加额外的功能,传统的编程模式需要写一个子类继承它,并重新实现类的方法。使用装饰器模式,仅需要在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性。
<span>DrawDecorator</span>.php
<?<span>php namespace Baobab; </span><span>/*</span><span>* * Interface DrawDecorator * @package Baobab * 装饰器接口,定义两个方法,渲染画布之前和之后可添加额外的能力 </span><span>*/</span> <span>interface</span><span> DrawDecorator{ </span><span>function</span><span> beforeDraw(); </span><span>function</span><span> afterDraw(); }</span>
<span>Canvas</span>.php
<?<span>php namespace Baobab; <br /><span>/**</span><br /><span>*Canvas类,绘制图形</span><br /><span>**/</span><br /> </span><span>class</span><span> Canvas { </span><span>public</span> <span>$data</span><span>; </span><strong><span>protected</span> <span>$decorators</span> = <span>array</span><span>(); </span></strong><span>//</span><span>Decorator</span> <span>function</span> init(<span>$width</span> = 20, <span>$height</span> = 10<span>) { </span><span>$data</span> = <span>array</span><span>(); </span><span>for</span>(<span>$i</span> = 0; <span>$i</span> < <span>$height</span>; <span>$i</span>++<span>) { </span><span>for</span>(<span>$j</span> = 0; <span>$j</span> < <span>$width</span>; <span>$j</span>++<span>) { </span><span>$data</span>[<span>$i</span>][<span>$j</span>] = '*'<span>; } } </span><span>$this</span>->data = <span>$data</span><span>; } </span><strong><span>function</span> addDecorator(DrawDecorator <span>$decorator</span><span>){ </span><span>$this</span>->decorators[] = <span>$decorator</span><span>; } </span><span>function</span><span> beforeDraw(){ </span><span>foreach</span>(<span>$this</span>->decorators <span>as</span> <span>$decorator</span><span>){ </span><span>$decorator</span>-><span>beforeDraw(); } } </span><span>function</span><span> afterDraw(){ </span><span>$decorators</span> = <span>array_reverse</span>(<span>$this</span>-><span>decorators); </span><span>foreach</span>(<span>$decorators</span> <span>as</span> <span>$decorator</span><span>){ </span><span>$decorator</span>-><span>afterDraw(); } } </span></strong><span>function</span><span> draw() { </span><strong><span>$this</span>-><span>beforeDraw(); </span></strong><span>foreach</span>(<span>$this</span>->data <span>as</span> <span>$line</span><span>) { </span><span>foreach</span>(<span>$line</span> <span>as</span> <span>$char</span><span>) { </span><span>echo</span> <span>$char</span><span>; } </span><span>echo</span> "<br />\n"<span>; } </span><strong><span>$this</span>-></strong><span><strong>afterDraw();</strong> } </span><span>function</span> rect(<span>$a1</span>, <span>$a2</span>, <span>$b1</span>, <span>$b2</span><span>) { </span><span>foreach</span>(<span>$this</span>->data <span>as</span> <span>$k1</span> => <span>$line</span><span>) { </span><span>if</span> (<span>$k1</span> < <span>$a1</span> or <span>$k1</span> > <span>$a2</span>) <span>continue</span><span>; </span><span>foreach</span>(<span>$line</span> <span>as</span> <span>$k2</span> => <span>$char</span><span>) { </span><span>if</span> (<span>$k2</span> < <span>$b1</span> or <span>$k2</span> > <span>$b2</span>) <span>continue</span><span>; </span><span>$this</span>->data[<span>$k1</span>][<span>$k2</span>] = ' '<span>; } } } }</span>
<span>ColorDrawDecorator</span>.php
<?<span>php namespace Baobab; <span>/**</span><br /><span>*修改图形颜色的装饰器</span><br /><span>*/ </span></span><span>class</span> ColorDrawDecorator <span>implements</span><span> \Baobab\DrawDecorator{ </span><span>protected</span> <span>$color</span><span>; </span><span>function</span> __construct(<span>$color</span> = 'black'<span>){ </span><span>$this</span>->color = <span>$color</span><span>; } </span><span>function</span><span> beforeDraw(){ </span><span>echo</span> "<div style='color: {<span>$this</span>->color};'>"<span>; }<br /> </span><span>function</span><span> afterDraw(){ </span><span>echo</span> "</div>"<span>; } }</span>
<span>SizeDrawDecorator</span>.php
<?<span>php namespace Baobab; <span><span>/**<br /><span>*修改图形大小的装饰器<br /><span>*/ </span></span></span></span> </span><span>class</span> SizeDrawDecorator <span>implements</span><span> \Baobab\DrawDecorator{ </span><span>protected</span> <span>$size</span><span>; </span><span>function</span> __construct(<span>$size</span> = '12px'<span>){ </span><span>$this</span>->size = <span>$size</span><span>; } </span><span>function</span><span> beforeDraw() { </span><span>echo</span> "<div style='font-size: {<span>$this</span>->size};'>"<span>; }<br /> </span><span>function</span><span> afterDraw() { </span><span>echo</span> "</div>"<span>; } }</span>
index.php
<span>$canvas</span> = <span>new</span><span> Baobab\Canvas(); </span><span>$canvas</span>-><span>init(); </span><span>$canvas</span>->rect(3, 6,4,12<span>); </span><span>$canvas</span>->addDecorator(<span>new</span> \Baobab\ColorDrawDecorator('blue'<span>)); </span><span>$canvas</span>->addDecorator(<span>new</span> \Baobab\SizeDrawDecorator('10px'<span>));<br />......<br />//可添加其他更多装饰器<br /> </span><span>$canvas</span>->draw();
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章
刺客信條陰影:貝殼謎語解決方案
3 週前ByDDD
Windows 11 KB5054979中的新功能以及如何解決更新問題
2 週前ByDDD
在哪裡可以找到原子中的起重機控制鑰匙卡
3 週前ByDDD
<🎜>:死鐵路 - 如何完成所有挑戰
4 週前ByDDD
Atomfall指南:項目位置,任務指南和技巧
4 週前ByDDD

熱工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),