你也可以創(chuàng)建一個(gè)測(cè)試用例以驗(yàn)證form表單何時(shí)有效:
class FormHandlerTestCase extends UnitTestCase { // ... function testValidate() { $post =& new Post; $post->set(‘fname’, ‘Jason’); $post->set(‘lname’, ‘Sweat’); $post->set(‘email’, ‘jsweat_php@yahoo.com’); $form = FormHandler::build($post); $this->assertTrue(FormHandler::validate($form, $post)); $this->assertNoUnwantedPattern(‘/invalid/i’, $form[0]->paint()); $this->assertNoUnwantedPattern(‘/invalid/i’, $form[1]->paint()); $this->assertNoUnwantedPattern(‘/invalid/i’, $form[2]->paint()); } }
這又提出了在本方法內(nèi)追蹤任何驗(yàn)證失敗的需求,因此它可以返回true如果所有的都合格。
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; } 214 The Decorator Pattern // email has to look real if (!preg_match(‘~\w+@(\w+\.)+\w+~’ ,$post->get(‘email’))) { $form[2] =& new Invalid($form[2]); $valid = false; } return $valid; } }
那些就是所有需要為頁(yè)面添加驗(yàn)證的building blocks 。這里是本游戲(章)結(jié)尾的一個(gè)截圖。
以及產(chǎn)生它的頁(yè)面代碼:
<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”; The Decorator Pattern 215 } ?> </div> <input type=”submit” value=”Submit”> </form> </body> </html>
總結(jié)
裝飾器模式是對(duì)你產(chǎn)生影響的那些模式中的另一個(gè),當(dāng)你使用他們工作一段時(shí)間以后。裝飾器模式允許你可以簡(jiǎn)單的通過(guò)嚴(yán)格的繼承問(wèn)題。你可以這樣認(rèn)為裝飾器:在運(yùn)行時(shí)可以有效地改變對(duì)象的類或者甚至多次—當(dāng)你在你的腳本不同的場(chǎng)合使用這個(gè)類。
也許裝飾器模式最重要的一個(gè)方面是它的超過(guò)繼承的能力!皢(wèn)題”部分展現(xiàn)了一個(gè)使用繼承的子類爆炸。基于裝飾器模式的解決方案,UML類圖展現(xiàn)了這個(gè)簡(jiǎn)潔靈活的解決方案。
下文:《PHP設(shè)計(jì)模式介紹》第十三章 適配器模式
本文鏈接:http://www.95time.cn/tech/program/2008/6091.asp
出處:phpchina
責(zé)任編輯:bluehearts
上一頁(yè) php設(shè)計(jì)模式介紹之裝飾器模式 [5] 下一頁(yè)
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|