»¶ÓÄú·ÃÎÊÎÒ°®IT¼¼ÊõÍø£¬½ñÌìС±àΪÄã·ÖÏíµÄ±à³Ì¼¼ÊõÊÇ£º¡¾¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚÊ®¶þÕ װÊÎÆ÷ģʽ¡¿£¬ÏÂÃæÊÇÏêϸµÄ·ÖÏí£¡
¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚÊ®¶þÕ װÊÎÆ÷ģʽ
ÈôÄã´ÓʹýÃæÏò¶ÔÏóµÄphp¿ª·¢£¬¼´Ê¹ºÜ¶ÌµÄʱ¼ä»òÕß½ö½öͨ¹ý±¾ÊéÁ˽âÁËһЩ£¬Äã»áÖªµÀ£¬Äã¿ÉÒÔ Í¨¹ý¼Ì³Ð¸Ä±ä»òÕßÔö¼ÓÒ»¸öÀàµÄ¹¦ÄÜ£¬ÕâÊÇËùÓÐÃæÏò¶ÔÏóÓïÑÔµÄÒ»¸ö»ù±¾ÌØÐÔ¡£Èç¹ûÒѾ´æÔÚµÄÒ»¸öphpÀàȱÉÙijЩ·½·¨£¬»òÕßÐëÒª¸ø·½·¨Ìí¼Ó¸ü¶àµÄ¹¦ÄÜ£¨÷ÈÁ¦£©£¬ÄãÒ²Ðí»á½ö½ö¼Ì³ÐÕâ¸öÀàÀ´²úÉúÒ»¸öÐÂÀà—Õ⽨Á¢ÔÚ¶îÍâµÄ´úÂëÉÏ¡£
µ«ÊDzúÉú×ÓÀಢ²»×ÜÊÇ¿ÉÄÜ»òÊǺÏÊʵġ£Èç¹û ÄãÏ£Íû¸Ä±äÒ»¸öÒѾ³õʼ»¯µÄ¶ÔÏóµÄÐÐΪ£¬ÄãÔõô°ì£¿»òÕߣ¬ÄãÏ£Íû¼Ì³ÐÐí¶àÀàµÄÐÐΪ£¬¸ÄÔõô°ì?ǰһ¸ö£¬Ö»ÄÜÔÚÓÚÔËÐÐʱÍê³É£¬ºóÕßÏÔȻʱ¿ÉÄܵ쬵«ÊÇ¿ÉÄܻᵼÖ²úÉú´óÁ¿µÄ²»Í¬µÄÀà—¿ÉŵÄÊÂÇé¡£
ÎÊÌâ
ÄãÈçºÎ×éÖ¯ÄãµÄ´úÂëʹÆä¿ÉÒÔÈÝÒ×µÄÌí¼Ó»ù±¾µÄ»òÕßһЩºÜÉÙÓõ½µÄ ÌØÐÔ£¬¶ø²»ÊÇÖ±½Ó²»¶îÍâµÄ´úÂëдÔÚÄãµÄÀàµÄÄÚ²¿£¿
½â¾ö·½°¸
×°ÊÎÆ÷ģʽÌṩÁ˸ıä×ÓÀàµÄÁé»î·½°¸¡£×°ÊÎÆ÷ģʽÔÊÐíÄãÔÚ²»ÒýÆð×ÓÀàÊýÁ¿±¬Õ¨µÄÇé¿ö϶¯Ì¬µÄÐÞÊζÔÏó£¬Ìí¼ÓÌØÐÔ¡£
µ±ÓÃÓÚÒ»×é×ÓÀàʱ£¬×°ÊÎÆ÷ģʽ¸ü¼ÓÓÐÓá£Èç¹ûÄãÓµÓÐÒ»×å×ÓÀࣨ´ÓÒ»¸ö¸¸ÀàÅÉÉú¶øÀ´£©£¬ÄãÐèÒªÔÚÓë×ÓÀà¶ÀÁ¢Ê¹ÓÃÇé¿öÏÂÌí¼Ó¶îÍâµÄÌØÐÔ£¬Äã¿ÉÒÔʹÓÃ×°ÊÎÆ÷ģʽ£¬ÒÔ±ÜÃâ´úÂëÖØ¸´ºÍ¾ßÌå×ÓÀàÊýÁ¿µÄÔö¼Ó¡£¿´¿´ÒÔÏÂÀý×Ó£¬Äã¿ÉÒÔ¸üºÃµÄÀí½âÕâÖֹ۵㡣¿¼ÂÇÒ»¸ö½¨Á¢ÔÚ×é¼þ¸ÅÄîÉϵēform”±íµ¥¿â£¬ÔÚÄÇÀïÄãÐèҪΪÿһ¸öÄãÏëÒª±íÏÖµÄ±íµ¥¿ØÖÆÀàÐͽ¨Á¢Ò»¸öÀà¡£ÕâÖÖÀàͼ¿ÉÒÔÈçÏÂËùʾ£º
Select and TextInputÀàÊÇ×é¼þÀàµÄ×ÓÀà¡£¼ÙÈçÄãÏëÒªÔö¼ÓÒ»¸ö“labeled”´ø±êÇ©µÄ×é¼þ—Ò»¸öÊäÈë±íµ¥¸æËßÄãÒªÊäÈëµÄÄÚÈÝ¡£ÒòΪÈκÎÒ»¸ö±íµ¥¶¼¿ÉÄÜÐèÒª±»±ê¼Ç£¬Äã¿ÉÄÜ»áÏóÕâÑù¼Ì³Ðÿһ¸ö¾ßÌåµÄ×é¼þ£º
ÉÏÃæµÄÀàͼ¿´ÆðÀ´²¢²»Ôõô»µ£¬ÏÂÃæÈÃÎÒÃÇÔÙÔö¼ÓÒ»Ð©ÌØÐÔ¡£±íµ¥ÑéÖ¤½×¶Î£¬ÄãÏ£ÍûÄܹ»Ö¸³öÒ»¸ö±íµ¥¿ØÖÆÊÇ·ñºÏ·¨¡£ÄãΪ·Ç·¨¿ØÖÆÊ¹ÓõĴúÂëÓÖÒ»´Î¼Ì³ÐÆäËü×é¼þ£¬Òò´ËÓÖÐèÒª²úÉú´óÁ¿µÄ×ÓÀࣺ
Õâ¸öÀà¿´ÆðÀ´²¢²»ÊÇÌ«»µ£¬ËùÒÔÈÃÎÒÃÇÔö¼ÓһЩÐµĹ¦ÄÜ¡£ÔڽṹÓÐЧÐÔÈ·ÈÏÖÐÄãÐèÒªÖ¸³ö½á¹¹ÊÇ·ñÊÇÓÐЧµÄ¡£ÄãÐèÒªÈÃÄã¼ìÑéÓÐЧÐԵĴúÂëÒ²¿ÉÒÔÓ¦Óõ½ÆäËü²¿¼þ£¬ÕâÑù²»ÓÃÔÙ¸ü¶àµÄ×ÓÀàÉϽøÐÐÓÐЧÐÔÑéÖ¤¡£
ÕâÀï×ÓÀàÒç³ö²¢²»ÊÇΨһµÄÎÊÌâ¡£ÏëÒ»ÏëÄÇÐ©ÖØ¸´µÄ´úÂ룬ÄãÐèÒªÖØÐÂÉè¼ÆÄãµÄÕû¸öÀà²ã´Î¡£ÓÐûÓиüºÃµÄ·½·¨£¡È·Êµ£¬×°ÊÎÆ÷ģʽÊDZÜÃâÕâÖÖÇé¿öµÄºÃ·½·¨¡£
×°ÊÎÆ÷ģʽ½á¹¹ÉÏÀàËÆÓë´úÀíģʽ£¨²Î¼ûµÚ2Õ£©¡£Ò»¸ö×°ÊÎÆ÷¶ÔÏó±£ÁôÓжԶÔÏóµÄÒýÓ㬶øÇÒÖÒʵµÄÖØÐ½¨Á¢±»×°ÊζÔÏóµÄ¹«¹²½Ó¿Ú¡£×°ÊÎÆ÷Ò²¿ÉÒÔÔö¼Ó·½·¨£¬À©Õ¹±»×°ÊζÔÏóµÄ½Ó¿Ú£¬ÈÎÒâÖØÔØ·½·¨£¬ÉõÖÁ¿ÉÒÔÔڽű¾Ö´ÐÐÆÚ¼äÓÐÌõ¼þµÄÖØÔØ·½·¨¡£
ΪÁË̽¾¿×°ÊÎÆ÷ģʽ£¬ÈÃÎÒÃÇÒÔÇ°ÃæÌÖÂÛ¹ýµÄ±íµ¥×é¼þ¿âΪÀý£¬²¢ÇÒÓÃ×°ÊÎÆ÷ģʽ¶ø²»ÊǼ̳У¬ÊµÏÖ“lable”ºÍ“invalidation”Á½¸öÌØÐÔ¡£
Ñù±¾´úÂ룺
×é¼þ¿â°üº¬ÄÄÐ©ÌØÐÔ£¿
1. ÈÝÒ×´´½¨±íµ¥ÔªËØ
2. ½«±íµ¥ÔªËØÒÔhtml·½Ê½Êä³ö
3. ÔÚÿ¸öÔªËØÉÏʵÏÖ¼òµ¥µÄÑéÖ¤
±¾ÀýÖУ¬ÎÒÃÇ´´½¨Ò»¸ö°üº¬ÐÕ£¬Ãû£¬ÓʼþµØÖ·£¬ÊäÈëÏîµÄ±íµ¥¡£ËùÓеÄÇøÓò¶¼ÊDZØÐëµÄ£¬¶øÇÒE-mail±ØÐë¿´ÆðÀ´ÊÇÓÐЧµÄE—mailµØÖ·¡£ÓÃHTMLÓïÑÔ±íʾ£¬±íµ¥µÄ´úÂëÏóÏÂÃæËùʾ£º
| <form action=”formpage.php” method=”post”> <b>First Name:</b> <input type=”text” name=”fname” value=””><br> <b>Last Name:</b> <input type=”text” name=”lname” value=””><br> <b>Email:</b> <input type=”text” name=”email” value=””><br> <input type=”submit” value=”Submit”> </form> |
Ôö¼ÓһЩcssÑùʽºó£¬±íµ¥äÖȾ³öÀ´ÈçÏÂͼËùʾ£º
Ϊ½¨Á¢Í³Ò»µÄAPI£¬ÎÒÃÇ´´½¨Ò»¸ö»ù±¾µÄ×é¼þÀࣨÈç¹ûÕâÊÇphp5µÄÀý×Ó£¬Õâ»òÐí»áʹÓýӿڣ©¡£¼ÈÈ»ËùÓеÄ×é¼þ£¨±íµ¥ÔªËØ£©¶¼±ØÐëäÖȾһЩÊä³ö£¬×齨Àà¿ÉÒÔ½ö½öÖ»ÓÐÒ»¸öpaint£¨£©·½·¨¡£
| class Widget { function paint() { return $this->_asHtml(); } } |
ÈÃÎÒÃÇÒÔÒ»¸ö»ù±¾µÄtextÊäÈë×é¼þ¿ªÊ¼¡£Ëü£¨×é¼þ£©±ØÐëÒª°üº¬ÊäÈëÇøÓòµÄÃû×Ö£¨name£©¶øÇÒÊäÈëÄÚÈÝ¿ÉÒÔÒÔHTMLµÄ·½Ê½äÖȾ¡£
|
class TextInput extends Widget { |
Ò»¸ö»ù±¾µÄ²âÊÔ¿ÉÒÔÑéÖ¤HTML´úÂëÊÇ·ñÕýÈ·——×÷Ϊ²ÎÊý´«Èë¸ø¹¹Ô캯ÊýµÄÃû×Ö£¬Öµ£¨ÄÚÈÝ£©ÊÇ·ñ´«µÝµ½äÖȾºóµÄÊä³öÖУº
| class WidgetTestCase extends UnitTestCase { function testTextInput() { $text=& new TextInput(‘foo’, ‘bar’); $output=$text->paint(); $this->assertWantedPattern( ‘~^<input type=”text”[^>]*>$~i’, $output); $this->assertWantedPattern(‘~name=”foo”~i’, $output); $this->assertWantedPattern(‘~value=”bar”~i’, $output); } } |
TextInput×é¼þ¹¤×÷Õý³££¬µ«ÊÇËüµÄÓû§½Ó¿Ú·Ç³£Ôã¸â£¬ËüȱÉÙÓѺõÄÃèÊö£¬Èç“First Name” »òÕß “Email Address.” ¡£Òò´Ë£¬ÏÂÒ»¸öÔö¼Óµ½×é¼þÀàµÄºÏÀíµÄÌØÐÔ¾ÍÊÇÒ»¸öÃèÊö¡£ÎÒÃǽøÈëÓÐÄܹ»Í³Ò»Ôö¼Ó£¨Ò»Ð©ÌØÐÔ£©ÄÜÁ¦µÄ×°ÊÎÆ÷ģʽ¡£
×÷Ϊ¿ªÊ¼£¬ÎÒÃǽ¨Á¢Ò»¸öÆÕͨµÄ¿ÉÒÔ±»À©Õ¹²úÉú¾ßÌåµÄÌØ¶¨×°ÊÎÆ÷µÄWidgetDecoratorÀà¡£ÖÁÉÙWidgetDecoratorÀàÓ¦¸ÃÄܹ»ÔÚËüµÄ¹¹Ô캯ÊýÖнÓÊÜÒ»¸ö×é¼þ£¬²¢¸´Öƹ«¹²·½·¨paint£¨£©¡£
| class WidgetDecorator { var $widget; function WidgetDecorator(&$widget) { $this->widget=& $widget; } function paint() { return $this->widget->paint(); } } |
Ϊ½¨Á¢Ò»¸ö±êÇ©£¨lable£©£¬ÐèÒª´«ÈëlableµÄÄÚÈÝ£¬ÒÔ¼°ÔʼµÄ×é¼þ£º
| class Labeled extends WidgetDecorator { var $label; function Labeled($label, &$widget) { $this->label=$label; $this->WidgetDecorator($widget); } } |
ÓбêÇ©µÄ×é¼þÒ²ÐèÒª¸´ÖÆpaint£¨£©·½·¨£¬²¢½«±êÇ©ÐÅÏ¢Ôö¼Óµ½Êä³öÖУº
| class Labeled extends WidgetDecorator { var $label; function Labeled($label, &$widget) { $this->label=$label; $this->WidgetDecorator($widget); } function paint() { return ‘<b>’.$this->label.’:</b> ‘.$this->widget->paint(); } } |
Äã¿ÉÒÔÓÃÒ»¸ö²âÊÔ¼ìÑéËü£º
| class WidgetTestCase extends UnitTestCase { function testLabeled() { $text=& new Labeled( ‘Email’ ,new TextInput(‘email’)); $output=$text->paint(); 208 The Decorator Pattern $this->assertWantedPattern(‘~^<b>Email:</b> <input~i’, $output); } } |
ÎÒÃÇÒѾ¿´µ½TextInputºÍLabeledÀàµÄÄÜÁ¦£¬Äã¿ÉÒÔ×°ÅäÒ»¸öÀàÕûÌåÀ´¹ÜÀí±íµ¥£¨form£©¡£
FormHandlerÀàÓÐÒ»¸ö¾²Ì¬µÄbuild£¨£©·½·¨´Ó±íµ¥µÄ¸÷ÖÖÔªËØ´´½¨Ò»¸ö²¿¼þµÄÊý×é¡£
| class FormHandlerTestCase extends UnitTestCase { function testBuild() { $this->assertIsA($form=FormHandler::build(new Post), ‘Array’); $this->assertEqual(3, count($form)); $this->assertIsA($form[1], ‘Labeled’); $this->assertWantedPattern(‘~email~i’, $form[2]->paint()); } } |
ʵÏÖFormHandler µÄ´úÂ룺
| class FormHandler { function build() { return array( new Labeled(‘First Name’, new TextInput(‘fname’)) ,new Labeled(‘Last Name’, new TextInput(‘lname’)) ,new Labeled(‘Email’, new TextInput(‘email’)) ); } } |
ÏÖÔÚ£¬Õâ¶Î´úÂë²¢²»Äܹ¤×÷—ûÓÐͨ¹ý$_postÌá½»µÄÊý¾Ý¡£ÒòΪÕâ¶Î´úÂë±ØÐëҪʹÓÃÒ»¸öMockObject¶ÔÏó (²Î¼ûµÚ6ÕÂ)²âÊÔ£¬ÏÖÔÚÎÒÃÇ¿ÉÒÔ½«$_postÊý¾Ý°ü×°ÔÚÒ»¸öÀàËÆ¹þÏ£µÄ¶ÔÏóÖЗÓëRegistry£¨²Î¼ûµÚÎåÕ£©ÀàËÆ£¬»òÕßÄ£·ÂWACTµÄDataSource´ÓSpecification pattern
| class Post { var $store=array(); function get($key) { if (array_key_exists($key, $this->store)) return $this->store[$key]; } function set($key, $val) { $this->store[$key]=$val; } } |
Ïë¸ü·½±ãµÄ»°£¬Äã¿ÉÒÔʹÓÃFactoryģʽ»òÕß×Ô¶¯Ìî³äµÄ·½·¨À´´Ó$_POSTÀïÃæÌáÈ¡¹Ø¼ü×Ö¡£
| class Post { // ... function &autoFill() { $ret=& new Post; foreach($_POST as $key=> $value) { $ret->set($key, $value); } return $ret; } } |
ʹÓÃÕâ¸öPostÀ࣬Äã¿ÉÒÔ±à¼ÄãµÄFormHandler::build() ·½·¨£¬Ä¬ÈÏʹÓÃÒѾ´æÔÚµÄ$_postÊý¾Ý£º
| class FormHandler { function build(&$post) { return array( new Labeled(‘First Name’ , new TextInput(‘fname’, $post->get(‘fname’))) ,new Labeled(‘Last Name’ , new TextInput(‘lname’, $post->get(‘lname’))) ,new Labeled(‘Email’ , new TextInput(‘email’, $post->get(‘email’))) ); } } |
ÏÖÔÚÄã¿ÉÒÔ´´½¨Ò»¸öphp½Å±¾Ê¹ÓÃFormHandlerÀàÀ´²úÉúHTML±íµ¥£º
| <form action=”formpage.php” method=”post”> <?php $post=& Post::autoFill(); $form=FormHandler::build($post); foreach($form as $widget) { echo $widget->paint(), “<br>\n”; } ?> <input type=”submit” value=”Submit”> </form> |
ÏÖÔÚ£¬ÄãÒѾӵÓÐÁËÒ»¸öÌá½»¸øËü×ÔÉí²¢ÇÒÄܱ£³ÖpostedÊý¾ÝµÄ±íµ¥´¦Àí£¨form handler£© Àà¡£
ÏÖÔÚ¡£ÎÒÃǼÌÐøÎª±íµ¥Ìí¼ÓһЩÑéÖ¤»úÖÆ¡£·½·¨ÊDZà¼ÁíÒ»¸ö×é¼þ×°ÊÎÆ÷ÀàÀ´±í´ïÒ»¸ö“invalid”״̬²¢À©Õ¹FormHandlerÀàÔö¼ÓÒ»¸övalidate£¨£©·½·¨ÒÔ´¦Àí×é¼þʾÀýÊý×é¡£Èç¹û×é¼þ·Ç·¨£¨“invalid”£©£¬ÎÒÃÇͨ¹ýÒ»¸ö“invalid”ÀཫËü°ü×°ÔÚ<span>ÔªËØÖС£ÕâÀïÊÇÒ»¸öÖ¤Ã÷Õâ¸öÄ¿±êµÄ²âÊÔ
| class WidgetTestCase extends UnitTestCase { // ... function testInvalid() { $text =& new Invalid(new TextInput(‘email’)); $output = $text->paint(); $this->assertWantedPattern( ‘~^<span class=”invalid”><input[^>]+></span>$~i’, $output); } } |
ÕâÀïÊÇInvalid WidgetDecorator×ÓÀࣺ
//´úÂëHere’s the Invalid WidgetDecorator subclass:
| class Invalid extends WidgetDecorator { function paint() { eturn ‘<span class=”invalid”>’.$this->widget->paint().’</span>’; } } |
×°ÊÎÆ÷µÄÒ»¸öÓеãÊÇÄã¿ÉÒÔ½«ËûÃÇ´®ÔÚÒ»Æð£¨Ê¹Óã©¡£Invalid×°ÊÎÆ÷½ö½öÖªµÀ£ºËüÕýÔÚ°ü×°Ò»¸ö×é¼þ£ºËü²»±Ø¹ØÐÄ×é¼þÊÇ·ñÊÇÒ»¸öTextInput, Select,»òÕßÊÇÒ»¸öÓбêÇ©µÄ±»×°Êΰ汾µÄ×é¼þ ¡£
Õâµ¼ÖÂÁËÏÂÒ»¸öºÏÀíµÄ²âÊÔÓÃÀý£º
| 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()); } } |
Õâ¸ö²âÊÔ²¶»ñ£¨°üº¬£©ÁËËùÓеĻù±¾·½Ã棺½¨Á¢Ò»¸öPostʵÀýµÄ´æ¸ù£¬Ê¹ÓÃËü½¨Á¢Ò»¸ö×é¼þ¼¯ºÏ£¬È»ºó½«¼¯ºÏ´«Ë͸øvalidate·½·¨¡£
| 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]); } } } |
²»Ðµ÷µÄ´úÂë
µ±ÎÒ¿´Õâ¶Î´úÂëʱ£¬ÎÒ·¢ÏÖÁËÁ½¸ö²»Ðµ÷Ö®´¦£ºÍ¨¹ýÊý×ÖË÷Òý·ÃÎÊ±íµ¥ÔªËØ£¬ÐèÒª´«µÝ$_postÊý×é¡£¸øvalidation·½·¨¡£ÔÚÒÔºóµÄÖØ¹¹ÖУ¬×îºÃÊÇ´´½¨Ò»¸ö×é¼þ¼¯ºÏÓÃÒ»¸öÒÔ±íµ¥ÔªËØÃû×ÖË÷ÒýµÄ¹ØÁªÊý×é±íʾ»òÕßÓÃÒ»¸öRegistryģʽ×÷Ϊ¸üºÏÀíµÄÒ»²½¡£ÄãÒ²¿ÉÒÔ¸øÀàWidgetÔö¼ÓÒ»¸ö·½·¨·µ»ØËüµÄ
µ±Ç°ÊýÖµ£¬È¡ÏûÐèÒª´«µÝ$_PostʵÀý¸øWidget¼¯ºÏµÄ¹¹Ô캯Êý¡£ËùÓÐÕâЩ¶¼³¬³öÁËÕâ¸öÀý×ÓÄ¿µÄµÄ·¶Î§¡£
ΪÁËÑé֤ĿµÄ£¬ÎÒÃǼÌÐøÔö¼ÓÒ»¸ö¼òµ¥µÄ ÕýÔò·½·¨£¨regex£©À´ÑéÖ¤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()); } } |
ʵÏÖÕâ¸ö¼òµ¥µÄemailÑéÖ¤µÄ´úÂëÈçÏ£º
//´úÂë
| 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]); } } } |
ÄãÒ²¿ÉÒÔ´´½¨Ò»¸ö²âÊÔÓÃÀýÒÔÑéÖ¤form±íµ¥ºÎʱÓÐЧ£º//´úÂë
| 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()); } } |
ÕâÓÖÌá³öÁËÔÚ±¾·½·¨ÄÚ×·×ÙÈκÎÑé֤ʧ°ÜµÄÐèÇó£¬Òò´ËËü¿ÉÒÔ·µ»ØtrueÈç¹ûËùÓеͼºÏ¸ñ¡£
|
//´úÂë class FormHandler { |
ÄÇЩ¾ÍÊÇËùÓÐÐèÒªÎªÒ³ÃæÌí¼ÓÑéÖ¤µÄbuilding blocks ¡£ÕâÀïÊDZ¾ÓÎÏ·£¨Õ£©½áβµÄÒ»¸ö½ØÍ¼¡£ÒÔ¼°²úÉúËüµÄÒ³Ãæ´úÂ룺
|
//´úÂë <html> |
×°ÊÎÆ÷ģʽÊǶÔÄã²úÉúÓ°ÏìµÄÄÇЩģʽÖеÄÁíÒ»¸ö£¬µ±ÄãʹÓÃËûÃǹ¤×÷Ò»¶Îʱ¼äÒÔºó¡£×°ÊÎÆ÷ģʽÔÊÐíÄã¿ÉÒÔ¼òµ¥µÄͨ¹ýÑϸñµÄ¼Ì³ÐÎÊÌâ¡£Äã¿ÉÒÔÕâÑùÈÏΪװÊÎÆ÷£ºÔÚÔËÐÐʱ¿ÉÒÔÓÐЧµØ¸Ä±ä¶ÔÏóµÄÀà»òÕßÉõÖÁ¶à´Î—µ±ÄãÔÚÄãµÄ½Å±¾²»Í¬µÄ³¡ºÏʹÓÃÕâ¸öÀà¡£
Ò²Ðí×°ÊÎÆ÷ģʽ×îÖØÒªµÄÒ»¸ö·½ÃæÊÇËüµÄ³¬¹ý¼Ì³ÐµÄÄÜÁ¦¡£“ÎÊÌ┲¿·ÖÕ¹ÏÖÁËÒ»¸öʹÓü̳еÄ×ÓÀ౬ը¡£»ùÓÚ×°ÊÎÆ÷ģʽµÄ½â¾ö·½°¸£¬UMLÀàͼչÏÖÁËÕâ¸ö¼ò½àÁé»îµÄ½â¾ö·½°¸¡£
ÒÔÉÏËù·ÖÏíµÄÊǹØÓÚ¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚÊ®¶þÕ װÊÎÆ÷ģʽ£¬ÏÂÃæÊDZà¼ÎªÄãÍÆ¼öµÄÓмÛÖµµÄÓû§»¥¶¯£º
¡¡¡¡Ïà¹ØÎÊÌ⣺ÔÚÉè¼ÆÄ£Ê½ÖУ¬ÓÐÒ»¸ö×°ÊÎ×Åģʽ£¬ÆäÖÐÓÐÒ»¶ÎÕâÑù...
¡¡¡¡´ð£º²»ÊÇÖ¸Ïò¶à¸ö×ÓÀ࣬ °´ÕâÌ⣬ b×ʼÊÇÖ¸ÏòMocha,µ÷ÓÃnew Soy(b)Ö®ºó£¬Soy³ÖÓÐb£¬´ËʱbÊÇMocha£¬ new SoyÍê³ÉÖ®ºóbÖ¸ÏòSoy£¬µ«ÊÇSoyÖÐÒѾ³ÖÓеĶÔÏóÊÇMocha£¬WhipºÍSoyµÄ¹ØÏµÒ²ÊÇÒ»Ñù£¬ ÎÒд¸ö´úÂë¸øÄã¿´ public class Test {public static vo... >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺Éè¼ÆÄ£Ê½ÖеÄ×°ÊÎÕßģʽʾÀý½²½â
¡¡¡¡´ð£ºDecorator¾ÍÊǶ¯Ì¬µØ¸ø¶ÔÏóÔöÌíÐÐΪ ÕâÀïDarkRoast£¬Mocha£¬Whip¶¼ÊÇʵÏÖÁËBeverage½Ó¿ÚµÄDecorator Beverage beverage2 = new DarkRoast();//beverage2ÊÇDarkRoast beverage2 = new Mocha(beverage2);//¸øbeverage2ÔöÌíÁËMochaµÄÐÐΪ beverage2... >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺IOSÉè¼ÆÖУ¬×°ÊÎÆ÷£¨Decorator£©Ä£Ê½ÊÇʲô£¿
¡¡¡¡´ð£º×°ÊÎÆ÷ģʽÔÚ²»ÐÞ¸ÄÔÀ´´úÂëµÄÇé¿ö϶¯Ì¬µÄ¸ø¶ÔÏóÔö¼ÓеÄÐÐΪºÍÖ°Ôð£¬Ëüͨ¹ýÒ»¸ö¶ÔÏó°ü×°±»×°ÊζÔÏóµÄ·½·¨À´ÐÞ¸ÄÀàµÄÐÐΪ£¬ÕâÖÖ·½·¨¿ÉÒÔ×öΪ×ÓÀ໯µÄÒ»ÖÖÌæ´ú·½·¨¡£ ÔÚObjective-CÖУ¬´æÔÚÁ½Öַdz£³£¼ûµÄʵÏÖ:Category(Àà±ð£©ºÍDelegation£¨Î¯... >>Ïêϸ
- ÆÀÂÛÁÐ±í£¨ÍøÓÑÆÀÂÛ½ö¹©ÍøÓѱí´ï¸öÈË¿´·¨£¬²¢²»±íÃ÷±¾Õ¾Í¬ÒâÆä¹Ûµã»ò֤ʵÆäÃèÊö£©
-
