推薦:《PHP設(shè)計模式介紹》第十一章 代理模式因為某個對象消耗太多資源,而且你的代碼并不是每個邏輯路徑都需要此對象, 你曾有過延遲創(chuàng)建對象的想法嗎 ( if和else就是不同的兩條邏輯路徑) ? 你有想過限制訪問某個對象,也就是說,提供一組方法
|
//代碼
class FormHandler { // ... function validate(&$form, &$post) { $valid = true; // first name required if (!strlen($post->get(‘fname’))) { $form[0] =& new Invalid($form[0]); $valid = false; } // last name required if (!strlen($post->get(‘lname’))) { $form[1] =& new Invalid($form[1]); $valid = false;} // email has to look real if (!preg_match(‘~\w @(\w \.) \w ~’ ,$post->get(‘email’))) { $form[2] =& new Invalid($form[2]); $valid = false; } return $valid; } }
|
那些就是所有需要為頁面添加驗證的building blocks 。這里是本游戲(章)結(jié)尾的一個截圖。以及產(chǎn)生它的頁面代碼:
|
//代碼
<html> <head> <title>Decorator Example</title> <style type=”text/css”> .invalid {color: red; } .invalid input { background-color: red; color: yellow; } #myform input { position: absolute; left: 110px; width: 250px; font-weight: bold;} </style> </head> <body> <form action=”<?php echo $_SERVER[‘PHP_SELF’]; ?>” method=”post”> <div id=”myform”> <?php error_reporting(E_ALL); require_once ‘widgets.inc.php’; $post =& Post::autoFill(); $form = FormHandler::build($post); if ($_POST) { FormHandler::validate($form, $post); } foreach($form as $widget) { echo $widget->paint(), “<br>\n”; } ?> </div> <input type=”submit” value=”Submit”> </form> </body> </html>
|
總結(jié)
裝飾器模式是對你產(chǎn)生影響的那些模式中的另一個,當(dāng)你使用他們工作一段時間以后。裝飾器模式允許你可以簡單的通過嚴格的繼承問題。你可以這樣認為裝飾器:在運行時可以有效地改變對象的類或者甚至多次—當(dāng)你在你的腳本不同的場合使用這個類。
也許裝飾器模式最重要的一個方面是它的超過繼承的能力。“問題”部分展現(xiàn)了一個使用繼承的子類爆炸�;谘b飾器模式的解決方案,UML類圖展現(xiàn)了這個簡潔靈活的解決方案。
分享:《PHP設(shè)計模式介紹》第十章 規(guī)范模式在一個應(yīng)用軟件的成型過程中,一些意想不到的商業(yè)邏輯到處出現(xiàn)。比如,基于價格的考慮,這個任務(wù)必須減少項目;而那個任務(wù)也因為銷售稅而必須選擇合適的比率;而其它的任務(wù)也必須因為其他的特別