裝飾器的一個(gè)優(yōu)點(diǎn)是你可以將他們串在一起(使用)。Invalid裝飾器僅僅知道:它正在包裝一個(gè)組件:它不必關(guān)心組件是否是一個(gè)TextInput, Select,或者是一個(gè)有標(biāo)簽的被裝飾版本的組件 。
這導(dǎo)致了下一個(gè)合理的測(cè)試用例:
class WidgetTestCase extends UnitTestCase { // ... function testInvalidLabeled() { $text =& new Invalid( new Labeled( ‘Email’ ,new TextInput(‘email’))); $output = $text->paint(); $this->assertWantedPattern(‘~<b>Email:</b> <input~i’, $output); $this->assertWantedPattern( ‘~^<span class=”invalid”>.*</span>$~i’, $output); } }
有了Invalid裝飾器,我們來處理FormHandler::validate() 方法:
class FormHandlerTestCase extends UnitTestCase { // ... function testValidateMissingName() { $post =& new Post; $post->set(‘fname’, ‘Jason’); $post->set(‘email’, ‘jsweat_php@yahoo.com’); $form = FormHandler::build($post); $this->assertFalse(FormHandler::validate($form, $post)); $this->assertNoUnwantedPattern(‘/invalid/i’, $form[0]->paint()); $this->assertWantedPattern(‘/invalid/i’, $form[1]->paint()); $this->assertNoUnwantedPattern(‘/invalid/i’, $form[2]->paint()); } }
這個(gè)測(cè)試捕獲(包含)了所有的基本方面:建立一個(gè)Post實(shí)例的存根,使用它建立一個(gè)組件集合,然后將集合傳送給validate方法。
class FormHandler { function validate(&$form, &$post) { // first name required if (!strlen($post->get(‘fname’))) { $form[0] =& new Invalid($form[0]); } 212 The Decorator Pattern // last name required if (!strlen($post->get(‘lname’))) { $form[1] =& new Invalid($form[1]); } } }
不協(xié)調(diào)的代碼
當(dāng)我看這段代碼時(shí),我發(fā)現(xiàn)了兩個(gè)不協(xié)調(diào)之處:通過數(shù)字索引訪問表單元素,需要傳遞$_post數(shù)組。給validation方法。在以后的重構(gòu)中,最好是創(chuàng)建一個(gè)組件集合用一個(gè)以表單元素名字索引的關(guān)聯(lián)數(shù)組表示或者用一個(gè)Registry模式作為更合理的一步。你也可以給類Widget增加一個(gè)方法返回它的
當(dāng)前數(shù)值,取消需要傳遞$_Post實(shí)例給Widget集合的構(gòu)造函數(shù)。所有這些都超出了這個(gè)例子目的的范圍。
為了驗(yàn)證目的,我們繼續(xù)增加一個(gè)簡(jiǎn)單的 正則方法(regex)來驗(yàn)證email地址:
class FormHandlerTestCase extends UnitTestCase { // ... function testValidateBadEmail() { $post =& new Post; $post->set(‘fname’, ‘Jason’); $post->set(‘lname’, ‘Sweat’); $post->set(‘email’, ‘jsweat_php AT yahoo DOT com’); $form = FormHandler::build($post); $this->assertFalse(FormHandler::validate($form, $post)); $this->assertNoUnwantedPattern(‘/invalid/i’, $form[0]->paint()); $this->assertNoUnwantedPattern(‘/invalid/i’, $form[1]->paint()); $this->assertWantedPattern(‘/invalid/i’, $form[2]->paint()); } }
實(shí)現(xiàn)這個(gè)簡(jiǎn)單的email驗(yàn)證的代碼如下:
class FormHandler { function validate(&$form, &$post) { // first name required if (!strlen($post->get(‘fname’))) { $form[0] =& new Invalid($form[0]); } // last name required if (!strlen($post->get(‘lname’))) { $form[1] =& new Invalid($form[1]); } // email has to look real if (!preg_match(‘~\w+@(\w+\.)+\w+~’ ,$post->get(‘email’))) { $form[2] =& new Invalid($form[2]); } } }
出處:phpchina
責(zé)任編輯:bluehearts
上一頁(yè) php設(shè)計(jì)模式介紹之裝飾器模式 [4] 下一頁(yè) php設(shè)計(jì)模式介紹之裝飾器模式 [6]
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|