»¶ÓÄú·ÃÎÊÎÒ°®IT¼¼ÊõÍø£¬½ñÌìС±àΪÄã·ÖÏíµÄ±à³Ì¼¼ÊõÊÇ£º¡¾¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚʮՠ¹æ·¶Ä£Ê½¡¿£¬ÏÂÃæÊÇÏêϸµÄ·ÖÏí£¡
¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚʮՠ¹æ·¶Ä£Ê½
ÔÚÒ»¸öÓ¦ÓÃÈí¼þµÄ³ÉÐ͹ý³ÌÖУ¬Ò»Ð©ÒâÏë²»µ½µÄÉÌÒµÂß¼µ½´¦³öÏÖ¡£±ÈÈ磬»ùÓÚ¼Û¸ñµÄ¿¼ÂÇ£¬Õâ¸öÈÎÎñ±ØÐë¼õÉÙÏîÄ¿£»¶øÄǸöÈÎÎñÒ²ÒòΪÏúÊÛ˰¶ø±ØÐëÑ¡ÔñºÏÊʵıÈÂÊ£»¶øÆäËüµÄÈÎÎñÒ²±ØÐëÒòΪÆäËûµÄÌØ±ðÌõ¼þ¶øÖÕÖ¹¡£Ò»Ð©ÉÌÒµ¹æÔòÊǼòµ¥µÄ£¬Ö»ÐèÒª²»µ½Ò»Á½¸ö²¼¶û±È½Ï¹ØÏµ¾Í¹»ÁË£¬È»¶øËüµÄ¹æÔò¿ÉÄÜÐèÒª·ÑʱµÄ¹À¼Æ£¬ÐèÒª²éѯÊý¾Ý¿â»òÕßÓû§ÊäÈëÊý¾ÝÀ´Òýµ¼¡£
ͨ¹ýÊéд´úÂë¿ÉÒ԰ѳéÏ󣨱ÈÈçÒ»ÌõÉÌÒµ¹æÔò£©×ª»¯Îª¾ßÌå¿É¼ûµÄ¶«Î÷¡£µ«ÊdzéÏóÎ±ÈÈ繺Î﷽ʽ£¬Ë°ÂÊ£¬»òÕß¼ÆË㺣Ô˷ѵȵȣ©¶¼ÓÐÆä½ø»¯µÄ·½Ê½£¬¶øÇÒÕâЩ¸Ä±äºÜÈÝÒ×Äѵ¹Ò»¸ö²»ÐÒÔ˵Ŀª·¢ÈËÔ±¡£ÎªÁ˱£Ö¤°²È«¿É¿¿——µ½Ä¿Ç°ÎªÖ¹ÄãÔÚÕâ±¾ÊéËù¿´µ½µÄ——¾¡¿ÉÄܵķÖÀë·â×°ÄÇЩÈÝÒ׸ıäµÄÄ£¿éÊǸöºÜÍêÃÀµÄÏë·¨¡£¶øÇÒ£¬ÕâµÄÈ·Ò²Ò»¸öÃ÷ÖǵÄÓ¦¶ÔÉÌÒµ¹æÔòµÄ²ßÂÔ¡£
ÎÊÌâÃèÊö
ÓÐûÓÐÃ÷È·µÄ·½Ê½À´·â×°ÉÌÒµÂ߼Ĩ£¿ÓÐûÓÐÒ»¸öÈÝÒ׸ÄдºÍÖØÓõļ¼ÊõÄØ£¿
½â¾ö·½°¸
¹æ·¶Ä£Ê½ÊÇΪÑéÖ¤ºÍÑ¡Ôñ¶ø¿ª·¢µÄ£º
È·ÈÏÒ»¸öÌØÊâµÄ¶ÔÏóÊÇ·ñÂú×ãÒ»¶¨µÄ±ê×¼
´Ó¼¯ºÏÖÐÑ¡Ôñ³öÂú×ã¸ø¶¨±ê×¼µÄÔªËØ¡£
¹æ·¶Ä£Ê½ÄÜÈÃÄãÓÐЧµÄ×éÖ¯ÕâЩ±ê×¼£¬²¢ÔÚÄãµÄÓ¦ÓóÌÐòÖÐÁé»îµÄʹÓÃËûÃÇ¡£
´úÂëÖØ¹¹¼¼ÊõÒѾ¼¤·¢ÄãµÄÐËȤ£¬Äã¾ö¶¨Ê¹ÓÃËüÀ´ÌáÉý´úÂëµÄÇåÎú¶ÈºÍÖØÓÃÐÔ¡£¹æ·¶Ä£Ê½Í¨¹ýϵͳ»¯½øÒ»²½µÄÉÁËÕâÒ»²½£¬Ëüϵͳ°ÑÕâ¸ö½á¹¹·Ö½â³ÉÒ»¸ö¸öµ¥¶ÀµÄ¶ÔÏó£¬ÕâЩ¶ÔÏóÄܹ»ºÜ·½±ãµÄ²åÈëµ½ÄãµÄÓ¦ÓóÌÐòµÄºÏÊʵط½¡£ºÜ¶àÇé¿öÏ£¬ÔÚÄãµÄÓ¦ÓóÌÐòÀ¹æ·¶¶ÔÏóÊDzÎÊý»¯µÄ£¬¶øÇÒ¾³£±»×éºÏÔÚÒ»ÆðÀ´¹¹½¨¸´ÔӵĺϺõÂß¼µÄ±í´ïʽ¡£
Ïà¹ØÖªÊ¶
Eric Evans ºÍ Martin Fowler ·¢±í¹ýһƪ¹ØÓڹ淶ģÐ͵ÄÎÄÕ£¬µØÖ·ÊÇ£º
http://www.martinfowler.com/apsupp/spec.pdf
Õâ¸öģʽÔÚEric EvansµÄÊé±¾¡¶¶¯Ì¬Çý¶¯Éè¼Æ¡·(“Domain Driven Design”)µÄµÚ224µ½273Ò³ÓÐÏêϸµÄ½éÉÜ¡£
ΪÁ˺ÏÀíµÄÈ«Ãæ¸²¸ÇÕâ¸öģʽ£¬ÕâÕ±»×éÖ¯³ÉºÏºõÂß¼µÄÈý²¿·Ö¡£µÚÒ»²¿·Öͨ¹ýÒ»¸ö´¿´âµÄʵÀýÀ´ËµÃ÷»ù±¾µÄģʽ¸ÅÄî¡££¨Evans ºÍ Fowler °ÑÕâ¸ö³ÆÎªÎª“Ó²±àÂë¹æ·¶Hard Coded Specification”£©¡£½ÓÏÂÀ´µÄ²¿·ÖÑÝʾÁËÈçºÎ¹¹½¨Ò»¸ö²ÎÊý»¯¹æ·¶Ä£ÐÍ£¬ËüÌṩÁËÒ»¸ö¸ü¼Ó¶¯Ì¬ºÍÁé»îµÄ¿ò¼ÜÀ´ÊµÏֹ淶ģʽ£¨»òÕßÒò´Ë¶ø³ÆÎª“²ÎÊý»¯¹æ·¶”£©µÄÖØÓá£×îºóÒ»²¿·Ö£¬ÎÒÃÇ¿ª·¢ÁËÒ»¸ö“·½°¸¹¤³§”£¨Policy Factory£©,Ëü°ÑÐí¶à¹æ·¶¶ÔÏó¼¯ÖгÉÒ»¸öÒ×ÓÚʹÓõİü£¨package£©¡£
Traveling to Warm Destinations(µ½ÎÂůµÄÄ¿µÄµØÈ¥ÂÃÐÐ)
×î½ü£¬ÎÒºÍÎҵļÒÈ˼ƻ®È¥¶ÈÒ»¸ö¼ÙÆÚ£¬Î񵀮Þ×ÓÏëÈ¥Ò»¸ö“ÎÂůµÄµØ·½”¡£ËäÈ»ÓÐÎÞÊýÂÃÐÐÏà¹ØµÄÕ¾µã£¬µ«ÊÇÔÚÎÒÃÇ·ÃÎʹýµÄÕ¾µãÖÐûÓÐÒ»¸öÕ¾µãÄܹ»ÎªÃ¿Ò»¸öÄ¿µÄµØÌṩÏêϸµÄÌìÆøÐÅÏ¢¡£Ã»°ì·¨£¬ÎÒÃDz»µÃ²»×ªµ½weather.comÈ»ºó¿ªÊ¼ËÑË÷£¬ÕâÊÇÊ®·ÖµÄ²»·½±ãµÄ¡£ÏÖÔÚÈÃÎÒÃÇÀ´¸Ä±äÕâÖÖÇé¿ö£¬ÎªÒ»¸ö¼Ù¶¨µÄÂÃÐÐÕ¾µãÔö¼ÓÒ»¸öÌìÆøËÑË÷¹¦ÄÜ¡£ÔÚÕâÀïÎÒÃÇÊÇÓù淶ģʽÕâ¸öÖ¸ÄÏÀ´Òýµ¼Äã±àÂ룬´Ó¶ø±È½ÏÂÃÐÐÕ߯ÚÍûµÄ×îµÍζȺÍÐí¶àÄ¿µÄµØµÄƽ¾ùζÈ
Ê×ÏÈ£¬ÎÒÃÇ´´½¨Ò»Ð©·Ç³£¼òµ¥µÄ¶ÔÏó¡£µÚÒ»¸öÊÇÂÃÐÐÕߣ¨a Traveler£©£¬Ëü´æ´¢ÁËÊ×Ñ¡µÄ×îµÍζȡ£
| // PHP5 class Traveler { public $min_temp; } |
½ÓÏÂÀ´ÎÒÃÇ´´½¨Ò»¸ö¶ÔÏóÀ´±íʾĿµÄµØ£¨Destination£©¡£ÓÉÓÚÆ½¾ùζÈÊÇÒ»¸ö¹Ø¼üµÄ±ê×¼£¬Ä¿µÄµØµÄ¹¹½¨º¯Êý£¨__constructor£©Ó¦¸ÃµÃµ½Ò»¸öÊ®¶þάµÄÊý×飬¸ÃÊý×éµÄÿһ¸öÖµ¶ÔÓ¦Ò»ÄêÀïÃæÃ¿¸öÔÂµÄÆ½¾ùζȡ£
| class Destination { protected $avg_temps; public function __construct($avg_temps) { $this->avg_temps=$avg_temps; } } |
Ä¿µÄµØ£¨Destination£©Í¬ÑùÒ²»¹ÒªÒ»¸ö·½·¨£¬Í¨¹ýµ÷ÓÃÕâ¸ö·½·¨Äܹ»µÃµ½Õâ¸öÄ¿µÄµØÔÚÖ¸¶¨ÔÂ·ÝµÄÆ½¾ùζȡ£
| class Destination { //... public function getAvgTempByMonth($month) { $key=(int)$month - 1; if (array_key_exists($key, $this->avg_temps)) { return $this->avg_temps[$key]; } } } |
×îºó£¬Ò»´ÎÂÃÐУ¨ÀàTrip£©¾ÍÓÉÒ»¸öÂÃÐÐÕߣ¨ÀàTraveler£©£¬Ò»¸öÄ¿µÄµØ£¨ÀàDestination£©ºÍÒ»¸öÈÕÆÚ£¨a Date£©ÁªºÏ×é³É¡£
| class Trip { public $date; public $traveler; public $destination; } |
¸ø³öÉÏÃæÕâЩ¶ÔÏó£¬Äã¾Í¿ÉÒÔͨ¹ýTrip£º£ºdateµÃµ½ÂÃÐеÄÔ·ݣ¬²¢ÇÒÄãÄܹ»±È½ÏÄ¿µÄµØµÄÔÂÆ½¾ùζȺÍÂÃÐÐÕ߯ÚÍûµÄ×îµÍζȡ££¨Õâ¸ö±È½Ï¿ÉÄܲ»ÊÇÌØ±ðµÄ¸´ÔÓ£¬µ«ÊÇÄ㻹ÊÇÐèÒªÄã×Ô¼ºÇ××ÔȥʵÏÖ£©
ÈÃÎÒÃÇ¿´¿´ÈçºÎÓù淶ģʽʵÏÖ“ÎÂůĿµÄµØ”µÄÉÌÒµÂß¼£¬²¢ÇÒ¿´¿´ÈçºÎÓ¦ÓÃÕâ¸öģʽÀ´Ñé֤ÿһ¸öÄ¿µÄµØ²¢Ñ¡Ôñ³öËùÓкÏÊʵÄÄ¿µÄµØ¡£
Ñù±¾´úÂë
¹æ·¶Ä£Ê½µÄºËÐÄÊÇÒ»¸ö´øÓÐIsSatisfiedBy()·½·¨µÄ¶ÔÏó£¬IsSatisfiedBy()·½·¨½ÓÊÕÒ»¸ö±äÁ¿À´ÆÀ¹À²¢ÇÒ·µ»ØÒ»¸ö»ùÓڹ淶±ê×¼µÄ²¼¶ûÖµ¡£
“Ä¿µÄµØÊÇ×ã¹»ÎÂůµÄ”µÄ±ê×¼¿ÉÄܾÍÊÇ£º
| class TripRequiredTemperatureSpecification { public function isSatisfiedBy($trip) { $trip_temp=$trip->destination->getAvgTempByMonth( date(‘m’, $trip->date)); return ($trip_temp >=$trip->traveler->min_temp); } } |
ÏÂÃæÊÇһЩ²âÊÔ£¬ÓÃÀ´¼ìÑéÕâ¸ö¹æ·¶ÊÇÈçºÎ¹¤×÷µÄ¡£
Ò»¸ö×î³õµÄ¸öÌå²âÊÔÊÂÀýÌṩÁËһЩĿµÄµØÀ´Ò»Æð¹¤×÷£º
| class TripSpecificationTestCase extends UnitTestCase { protected $destinations=array(); function setup() { $this->destinations=array( ‘Toronto’=> new Destination( array(24, 25, 33, 43, 54, 63, 69, 69, 61, 50, 41, 29)) ,’Cancun’=> new Destination( array(74, 75, 78, 80, 82, 84, 84, 84, 83, 81, 78, 76)) ); } } |
£¨¹¹ÔìÕâЩĿµÄµØ£¨Destination£©ÐèÒªÔÚʵÀý»¯µÄʱºòÊäÈëÒ»¸ö°üº¬Ã¿ÔÂÆ½¾ùζȵÄÊý×é¡£×öΪһ¸öÃÀ¹úµÄ×÷Õߣ¬ÔÚÕâЩÀý×ÓÖÐÎÒÑ¡ÔñÁË»ªÊÏζȡ£¶ÔÓ¦µÄ£¬VickiÆÚÍûµÄ»ªÊÏζÈ70¶ÈµÈ¼ÛÓÚÉãÊÏζÈ21¶È£©
ÏÂÒ»¸ö²âÊÔ¹¹½¨ÁËÒ»¸öÂÃÐÐÕߣ¨Traveler£©£¬²¢ÇÒÉèÖÃÁËËüµÄÊ×Ñ¡×îµÍζȺÍÂÃÐÐÈÕÆÚͬʱҲѡÔñÁËÒ»¸öÄ¿µÄµØ¡£Õâ×î³õµÄ×éºÏ“×îµÍζÈ70¶È£¨»ªÊÏζȣ©£¬Ä¿µÄµØ¶àÂ׶ࣨToronto£©£¬ÈÕÆÚ¶þÔÂÖÐÑ®”»áºÍÆÚÍûµÄÒ»Ñù£¬ÊDz»ÄÜͨ¹ýµÄ¡£
| class TripSpecificationTestCase extends UnitTestCase { // ... function TestTripTooCold() { $vicki=new Traveler; $vicki->min_temp=70; $toronto=$this->destinations[‘Toronto’]; $trip=new Trip; $trip->traveler=$vicki; $trip->destination=$toronto; $trip->date=mktime(0,0,0,2,11,2005); $warm_enough_check=new TripRequiredTemperatureSpecification; $this->assertFalse($warm_enough_check->isSatisfiedBy($trip)); } } |
µ«ÊÇ£¬½ÓÏÂÀ´µÄÕâ¸ö×éºÏ“70¶È£¬¶þÔÂÖÐÑ®£¬Cancun ”¾Í»áͨ¹ý£¬ºÍÎÒÃÇÆÚÍûµÄÒ»Ñù¡£
| class TripSpecificationTestCase extends UnitTestCase { // ... function TestTripWarmEnough() { $vicki=new Traveler; $vicki->min_temp=70; $cancun=$this->destinations[‘Cancun’]; $trip=new Trip; $trip->traveler=$vicki; $trip->destination=$cancun; $trip->date=mktime(0,0,0,2,11,2005); $warm_enough_check=new TripRequiredTemperatureSpecification; $this->assertTrue($warm_enough_check->isSatisfiedBy($trip)); } } |
²ÎÊý»¯¹æ·¶
Trip Required Temperature Specification±ØÐëºÜÊìϤTrip¶ÔÏóµÄ½á¹¹£¬²¢ÇÒ×êÑÐTrip¶ÔÏóµÄÈý¸öpublic£¨¹«¿ª£©ÊôÐÔ¡£Õâ²¢²»ÊǺÜÔã¸âµÄ¡£ÊÂʵÉÏ£¬ÔÚ¹ýȥʹÓù淶ģʽµÄ¹ý³ÌÖУ¬ÎÒ·¢ÏÖ²»Éٹ淶µÃÒæÓÚÎÒ¶ÔÌØÓвÎÊý¶ÔÏóµÄÏêϸÁ˽⡣Ȼ¶ø£¬ÕâÖÖ½ôÃܵÄÁªÏµ¶Ô¹æ·¶µÄÖØÓôøÀ´Á˺ܴóµÄÂé·³¡£
ÐÒÔ˵ÄÊÇ£¬¸÷ÖÖ²»Í¬µÄ¹æ·¶Ä£Ê½ÒѾ¿ªÊ¼×ÅÊÖ´ÓÊ´úÂëÖØÓÃÎÊÌâµÄÑо¿¡£ÌرðÖµµÃÌá³öµÄÊÇ£¬²ÎÊý»¯¹æ·¶Ä£Ê½Í¨¹ý¹¹ÔìÆ÷£¨constructor£©À´½ÓÊÕ²ÎÊý£¬Õâ¸ö²ÎÊýÖ÷ÒªÓÃÓÚÈ·¶¨isSatisfiedBy()º¯ÊýµÄ½ø»¯±ê×¼¡£
ÏÖÔÚÈÃÎÒÃÇ¿´¿´Õâ¸ö²ÎÊý»¯¹æ·¶£¬ËüʹÓÃÁËÏàͬÂÃÐÐÕ¾µãµÄ¶ÔÏó¡£¼Ù¶¨ÄãÒªËÑË÷³öÒ»¸öÄ¿µÄµØµÄÁÐ±í£¬²¢ÇÒÁбíÏÔʾ³öÂú×ã“×ã¹»ÎÂů”±ê×¼µÄ³ÇÊС£
ʹÓÃÔÀ´µÄTrip Required Temperature Specification£¬Äã²»µÃ²»ÎªÃ¿¸öÆÀ¹À´´½¨Ò»¸öTrip¶ÔÏó¡£ÕâÊÇÒòΪ£¨ÔÚÕâ¸öÃ÷È·µÄÎÊÌâÉÏ£©ÂÃÐÐÕߣ¨Traveler£©ºÍÂÃÐÐÈÕÆÚ£¨Date£©ÊDz»±äµÄ£¬½ö½öÖ»ÓÐÄ¿µÄµØÒòΪÄã²»¶ÏµÄÖØÊö¿ÉÐÐÄ¿µÄµØÁÐ±í¶ø²»¶Ï±ä»¯¡£
ʹÓòÎÊý»¯¹æ·¶£¬Äã¼ÇסÁËÂÃÐÐÕßÊ×Ñ¡µÄζȺÍÂÃÐÐÈÕÆÚ£¬²¢ÇÒÄãֻҪͨ¹ý´«µÝÒ»¸ö±äÁ¿µ½·½·¨isSatisfiedBy()¾Í¿ÉÒԱȽÏÄ¿µÄµØ¡£
²ÎÊý»¯¹æ·¶¶ÔÏóDestination Required Temperature SpecificationµÄ¹¹Ô캯ÊýÐèÒªÒ»¸öÂÃÐÐÕߣ¨Traveler£©ºÍÒ»¸öÈÕÆÚ£¨Date£©À´ÊµÀý»¯Õâ¸ö¹æ·¶¡£
| class DestinationRequiredTemperatureSpecification { protected $temp; protected $month; public function __construct($traveler, $date) { $this->temp=$traveler->min_temp; $this->month=date(‘m’, $date); } } |
ÓÉÓÚ´æ´¢ÔÚʵÀý»¯±äÁ¿ÖеÄÊý¾Ý£¨Î¶ȺÍÈÕÆÚ£©µÄÒ»ÖÂÐÔ£¬Destination Required Temperature SpecificationµÄ·½·¨isSatisfiedBy()°ÑÄ¿µÄµØ£¨Destination£©×öΪһ¸öÊäÈë²ÎÊýÀ´ÆÀ¹À¡£
| class DestinationRequiredTemperatureSpecification { // ... function isSatisfiedBy($destination) { return ($destination->getAvgTempByMonth($this->month) >=$this->temp); } } |
ÏÖÔÚÄã¿ÉÒÔдһ¸ö²âÊÔʵÀýÀ´¹ýÂËÄ¿µÄµØÁÐ±í¡£
|
class DestinationSpecificationTestCase extends UnitTestCase { |
ÏÖÔÚÈÃÎÒÃÇ¿´¿´ÁíÍâÒ»¸öÀý×Ó£¬ÔÚÕâ¸öÀý×ÓÀïÃæÊý¾ÝÀàÐͺ͹淶¶¼±ØÐëÊǷdz£µÄÁé»îÒ×±äµÄ¡£
ÔÚwebÓ¦ÓóÌÐòÖУ¬×î³£ÓÃÒ²×îÈÃÈË·¢¿ñµÄÒ»¸öÎÊÌâ¾ÍÊÇÈ·ÈÏ±íµ¥ÊäÈ루¶Ô±íµ¥ÊäÈëÊý¾ÝµÄÑéÖ¤£©¡£ÔÚÈí¼þ¿ª·¢¹ý³ÌÖУ¨ÉõÖÁÔÚ¿ª·¢¹ý³ÌÍ⣩£¬±íµ¥ÊǾ³£¸Ä±äµÃ£¬¶øÇÒÔÚ´óÐ͵ĻòÕß¹¦ÄܷḻµÄÓ¦ÓóÌÐòÀïÃæ£¬±íµ¥µÄÊýÁ¿Äܹ»ºÜ¿ìµÄÔö³¤¡£Äã¿ÉÒÔ´´½¨Ò»¸öΨһµÄ¶ÔÏóÀ´·âװÿһ¸ö±íµ¥£¬È»ºóʹÓù淶ģʽÀ´È·ÈÏÿһ¸ö¶ÔÏ󣬵«Õâ¾ø¶ÔÊÇÒ»¸ö³ÖÐøµÄ¶ñÃΡ£
ÓÐûÓÐÒ»¸ö·½±ãµÄÊý¾ÝÀàÐÍÄܹ»ºÜÈÝÒ×µÄÊÊÓ¦ÈκÎÒ»¸ö±íµ¥Âð£¿Èç¹ûÓУ¬ÄÇôÓÐûÓÐÒ»¸öÄܹ»È·È϶¯Ì¬Êý¾ÝÀàÐ͵ķ½Ê½ÄØ£¿
ÉÏÃæÃ¿Ò»¸öÎÊÌâµÄ´ð°¸ÏÔÈ»Êǿ϶¨µÄ¡£
WEBÓ¦ÓóÌÐò×é¼þ¹¤¾ßÏ䣨¼ò³ÆWACT£©µÄÊý¾ÝÔ´£¨DataSource£©½Ó¿ÚÄܹ»get(»ñÈ¡)£¬set£¨ÉèÖã©,£¬²¢ÇÒ¶¯Ì¬µÄ´´½¨¶ÔÏóÊôÐÔ£¨ÓеãÀàËÆPHP4µÄ_GET()ºÍ_SET()·½·¨£©£¬ÕâЩ¶ÔÏóÊôÐÔ¾ÍÊÇ±íµ¥µÄ·â×°²Ù×÷ÊÖ±ú¡££¨ÊìϤJAVAµÄ¶ÁÕß¿ÉÒÔ°ÑÒ»¸öÊý¾ÝÔ´£¨DataSource£©Àí½âδJAVAÖеĹþϣͼ£¨HashMap£©£©Í¬Ê±£¬²ÎÊý»¯¹æ·¶Ä£Ê½ÌṩÁËÒ»¸öÄ£ÐÍÒÔÒ»¶¨µÄ±ê×¼À´ÑéÖ¤Ò»¸öÊý¾ÝÔ´¡£
×¢£ºWACT
WACT£¬WEBÓ¦ÓóÌÐò×é¼þ¹¤¾ßÏ䣬Äܹ»ÔÚSourceForge£¨http://wact.sf.net£©ÉÏÏÂÔØµ½¡£ËüÊÇÒ»¸öPHP¿âÀ࣬ÓÃÀ´½â¾öÔÚWEBÓ¦ÓóÌÐò¿ª·¢ÖÐһЩ³£ÓõÄÎÊÌâ¡£WACTºÜ×¢ÖØ´úÂëÖØÓᢵ¥Ìå²âÊÔºÍʹÓÃÉè¼ÆÄ£Ê½·½ÃæµÄ¼¼Êõ¡£WACTÀíÂÛÏà¹ØµÄÐÅϢλÓÚhttp://wact.sf.net/index.php/datasource
WACTÊý¾ÝÔ´£¨DataSource£©Àà°üº¬ÔÚÕâ±¾ÊéµÄÔ´´úÂëÀïÃæ£¬ÕâÑùÄã¿ÉÒÔ·½±ãµÄ²âÊÔÕâЩ´úÂë¡£
ÔÚÕâ¸öÀý×ÓÖУ¬Êý¾ÝÔ´£¨DataSource£©Àà¿ÉÒÔ±»ÈÏΪÈçÏÂÃæµÄ´úÂëËùʾ£¬Ëü¼¸ºõºÍµÚ5Õ¿ª·¢µÄRegister£¨×¢²á£©ÀàÍêȫһÑù¡£
| class DataSource { protected $store=array(); function get($key) { if (array_key_exists($key, $this->store)) return $this->store[$key]; } function set($key, $val) { $this->store[$key]=$val; } } |
Êý¾ÝÔ´£¨DataSource£©Ö±½Óͨ¹ýÒ»´®±êʶ·ûÀ´»ñȡһ¸ö¶ÔÏóµÄÊôÐÔ¡£·½·¨Set()ÓÃÀ´¸Ä±äÔÓеÄÊôÐÔ»òÕß¶¯Ì¬µÄ´´½¨ÐµÄÊôÐÔ£¬·½·¨get()ÔòÄÜ·µ»ØÖ¸¶¨Ãû³ÆµÄÊôÐÔ¡£
µ±ÄãµÄÓ¦ÓóÌÐò±ØÐë¼Ó¹¤´¦ÀíÒ»¸ö±íµ¥£¬Äã¿ÉÒÔÏȰÑ$_POST¹ýÀ´µÄÊý¾ÝÖµ×°ÔØµ½Êý¾ÝÔ´DataSource£¬È»ºóʹÓòÎÊý»¯¹æ·¶À´Íê³É±íµ¥µÄÑéÖ¤¡££¨Í¬ÑùµÄ·½·¨Ò²¿ÉÒÔÓõ½ÅäÖÃÎļþÉÏ£¬°ÑÅäÖÃÎļþµÄÊý¾Ý×°ÔØµ½DataSourceÊý¾ÝÔ´£¬È»ºóʹÓù淶À´ÑéÖ¤£©¡£
ÏÖÔÚ£¬ÈÃÎÒÃǹ¹ÔìÒ»¸ö²ÎÊý»¯¹æ·¶µÄʾÀýÀ࣬Ö÷ÒªÓÃÀ´´î½¨Ò»¸öÊý¾Ý¿é¡£Ê×ÏÈ£¬ÎÒÃÇÒª½¨Ò»¸ö¹æ·¶£¬Õâ¸ö¹æ·¶µÃÂú×ã“ijһ¸ö×ֶκÍÖ¸¶¨µÄÖµµÈ¼Û”µÄÌõ¼þ¡£
| class FieldEqualSpecification { protected $field; protected $value; public function __construct($field, $value) { $this->field=$field; $this->value=$value; } public function isSatisfiedBy($datasource) { return ($datasource->get($this->field)==$this->value); } } |
Õâ¸ö˼·ÊǺܼòµ¥µÄ£ºÔÚ¹¹Ô죨construction£©ÆÚ¼ä£¬´æ´¢Ò»¸ö×ֶκÍËüÆÚÍûµÄÖµ£¬´ÓÊý¾ÝÔ´(DataSource)ÖлñÈ¡µ½ÆÚÍûµÄÖµ´«µÝµ½·½·¨isSatisfiedBy()£¬È»ºó±È½Ï¡£
ΪÁ˲âÊÔÕâ¸ö¹æ·¶£¬Ð´Ò»¸ö²âÊÔʵÀýÀ´ÑÝʾÕâ¸öÊý¾ÝÔ´£¨DataSource£©£º
| class SpecificationsTestCase extends UnitTestCase { protected $ds; function setup() { $this->ds=new DataSource; $this->ds->set(‘name’, ‘Jason’); $this->ds->set(‘age’, 34); $this->ds->set(‘email’, ‘jsweat_php@yahoo.com’); $this->ds->set(‘sex’, ‘male’); } } |
ÔÚÉÏÃæµÄÀý×ÓÀ·½·¨setup()´´½¨ÁËÒ»¸öÊý¾ÝÔ´¶ÔÏ󣬲¢ÉèÖÃÁËÏàÓ¦µÄÊôÐÔ¡£Õâ¸ö²âÊÔ»¹°üº¬Ò»¸ö·½·¨£¬Õâ¸ö·½·¨ÒªÃ´·µ»ØpassҪô·µ»Øfail¡£
| class SpecificationsTestCase extends UnitTestCase { // ... function TestFieldEqualSpecification() { $name_jason=new FieldEqualSpecification(‘name’, ‘Jason’); $this->assertTrue($name_jason->isSatisfiedBy($this->ds)); $sex_other=new FieldEqualSpecification(‘sex’, ‘other’); $this->assertFalse($sex_other->isSatisfiedBy($this->ds)); } } |
ͨ³£ÔÚÆÀ¹À×Ö·û´®µÄʱºò£¬Ò»¸öÕýÔò±í´ïʽ±ÈһϵÁÐÑϸñµÄ±È½Ï¹ØÏµÄܹ»¸üºÃµÄ°ïÖúÄãÀ´¶¨ÒåÄãµÄÐèÇó¡£ÄÇô£¬ÈÃÎÒÃÇÔÚFieldMatchSpecificationÖÐʹÓÃÕýÔò±í´ïʽÀ´Æ¥ÅäÎÒÃǵĹ淶¹¤¾ß¼¯¡£
|
class FieldMatchSpecification { |
ÔÚÕâ¸öÀý×ÓÀÕâ¸ö×ֶζÔÓ¦µÄÖµºÍPCRE±í´ïʽ¶¼ÔÚ¹¹ÔìµÄʱºò±£´æºÃÁË¡£È»ºó·½·¨isSatisfiedBy()´Ó´«µÝ¹ýÀ´µÄÊý¾ÝÔ´DataSource»ñÈ¡µ½Õâ¸ö×ֶΣ¬²¢ÇÒʹÓÃpreg_match()·½·¨À´±È½ÏËüµÄÖµÊÇ·ñÂú×ã¶ÔÓ¦µÄÕýÔò±í´ïʽ¡£
ÏÂÃæÕâ¸öÀý×ÓÑÝʾÁËÈçºÎΪFieldMatchSpecification×Ö¶ÎÆ¥Å乿·¶Êéд²âÊÔʵÀý¡£
| class SpecificationsTestCase extends UnitTestCase { // ... function TestFieldMatchSpecification() { $valid_email=new FieldMatchSpecification( ‘email’, ‘/^[^\s@]+@[^\s.]+(?:\.[^\s.]+)+/’); $this->assertTrue($valid_email->isSatisfiedBy($this->ds)); $name_ten_letters=new FieldMatchSpecification( ‘name’, ‘/^\w{10}$/’); $this->assertFalse($name_ten_letters->isSatisfiedBy($this->ds)); } } |
ÉÏÃæÀý×ÓÖеÄemailÕýÔòÒªÇó“ÔÚ@ǰÊÇÒ»´®²»°üº¬¿Õ¸ñ¡¢@µÄ×Ö·û£¬ÔÚ@ºóÊÇÁ½×é»òÕßÁ½×éÒÔÉϲ»°üº¬¿É¸ö¿Õ¸ñ»òÕß¾äµãµÄ×Ö·û´®£¬ÕâЩ×Ö·û´®Ö®¼äÓɾäµã¼ä¸ô×Å”¡£¶ø±äÁ¿$name_ten_letters¹æ·¶ÒªÇóÊäÈëµÄÖµ±ØÐëÇ¡ºÃÊÇÓÉ10¸ö×Ö·û×é³É¡£
×¢£ºÕýÔò±í´ïʽ
ÓÐÐí¶àÊé¼®µ¥¶À¿ªÒ»ÕÂÀ´½²½âÕýÔò±í´ïʽ£¬ÉõÖÁÓÐЩÕû±¾Êé¶¼ÔÚÌÖÂÛÕâ¸ö»°Ì⣨ÒëÕß×¢£º×÷ÕßÊÇΪÁË˵Ã÷ÕýÔò±í´ïʽµÄÖØÒªÐÔºÍÄѶȣ©¡£ËùÒÔ£¬ÇëÈÏʶµ½ÉÏÃæµÄ´úÂëÖ»ÊÇÒ»¸ö¹ýÓÚ¼òµ¥»¯µÄÀý×Ó£¬¶ø²»ÊÇÒ»¸ö¼ì²éemailµÄÍêÉÆµÄÕýÔò±í´ïʽ¡£
ÏÂÃæÈÃÎÒÃǴ×îºóÒ»¸ö¾ßÌåµÄ¹æ·¶ÓÃÀ´¼ìÑéÒ»¸ö×Ö¶ÎÖµÊÇ·ñ´óÓÚ»òÕßµÈÓÚ¶ÔÓ¦µÄÖµ¡£ÎÒÃǺÁÎÞÒÉÎʵİÑËüÃüÃûΪFieldGreaterThanOrEqualSpecification.¡£
| class FieldGreaterThanOrEqualSpecification { protected $field; protected $value; public function __construct($field, $value) { $this->field=$field; $this->value=$value; } public function isSatisfiedBy($datasource) { return ($datasource->get($this->field) >=$this->value); } } |
ÕâÀïûÓÐÌ«¶àµÄ²»¿É˼ÒéµÄ£ºÔÚ¹¹ÔìÆ÷ÀïÃæ´æ´¢ÏàÓ¦µÄÒª±»±È½ÏµÄ×ֶκÍÖµ£¬È»ºóÔÚ·½·¨isSatisfiedBy()ÀïÃæÑéÖ¤ÌáÈ¡³öÀ´µÄ×ֶΡ£
ÏÂÃæÊÇÒ»¸ö²âÊÔʵÀý£¬ÓÃÀ´ÑÝʾÈçºÎÓ¦ÓÃFieldGreaterThanOrEqualSpecification¡£
| class SpecificationsTestCase extends UnitTestCase { // ... function TestFieldGreaterThanOrEqualSpecification() { $adult= new FieldGreaterThanOrEqualSpecification(‘age’, 18); $presidential_age= new FieldGreaterThanOrEqualSpecification(‘age’, 35); $this->assertTrue($adult->isSatisfiedBy($this->ds)); $this->assertFalse($presidential_age->isSatisfiedBy($this->ds)); } } |
ÄãÊÇ·ñÒѾעÒâµ½Ôڹ淶¶ÔÏó±»±êʶÉϺÏÀíµÄÃû³ÆÊ±ºò£¬ÕâЩ´úÂëÊÇÈçºÎ¿ªÊ¼Ö¤Ã÷×Ô¼ºµÄÂð£¿ÄãÊÇ·ñÄܹ»Í¨¹ý¹æ·¶¶ÔÏóµÄÃû³ÆÀ´Àí½âµ½´úÂëµÄÏàÓ¦µÄ¹¦ÄÜ£¿ $adult->isSatisfiedBy($something)Äã¿´Ò»Ñ۾ͻáÃ÷°×£¬¸ù±¾ÎÞÐèÉîÈëÏêϸµÄ×êÑдúÂë¡£ÕâÒ²Êǹ淶ģʽµÄÓŵãÖ®Ò»°É¡£
µ½ÏÖÔÚΪֹ£¬ÄãÓ¦¸ÃºÜÇå³þµÄÃ÷°×¹æ·¶Ä£Ê½¾ÍÈçÒ»¸ö½Ó¿Ú¡£Ê¹ÓÃPHP5Ã÷È·µÄ±íʾ³öÕâ¸ö¹æ·¶Ä£Ê½£º
| interface Specification { public function isSatisfiedBy($datasource); } |
ÎÒÃǰÑÕâЩ»ù±¾µÄÄ£¿é°´ÕÕÒ»¶¨µÄ¸ñʽ¼¯ÖÐÆðÀ´£¬ÕâÉõÖÁÊǷdz£ÓÐÓõġ£ÒòΪ´ÓÒ»¸ö¹æ·¶ÀàµÄ·½·¨isSatisfiedBy()Öзµ»ØµÄ½á¹ûÊÇÒ»¸ö²¼¶ûÖµ(boolean)£¬°ÑÕâЩ²¼¶ûÖµÔËÓõ½¾ßÌ岻ͬµÄ¹æ·¶ÀàµÄЧ¹û¶¼ÊÇÏ൱ºÃµÄ¡£
ΪÁËʵÏÖÂß¼Ó룬ÎÒÃÇ´´½¨Ò»¸öÀ࣬°ÑÁ½¸ö¾ßÌåµÄ¹æ·¶ÊµÀýÀà×éºÏÆðÀ´£¬µ±¸ø³öµÄÊý¾ÝÔ´²ÎÊýͬʱÂú×ã¸ø¶¨µÄÌõ¼þºó¾Í·µ»Øtrue¡£
| class AndSpecification implements Specification { protected $spec; protected $andSpec; public function __construct($spec, $andSpec) { $this->spec=$spec; $this->andSpec=$andSpec; function isSatisfiedBy($datasource) { return ($this->spec->isSatisfiedBy($datasource) && $this->andSpec->isSatisfiedBy($datasource)); } |
ÄãÒ²¿ÉÒÔÀàËÆµÄʵÏÖÂß¼»ò¡£
| class OrSpecification implements Specification { protected $spec; protected $orSpec; public function __construct($spec, $orSpec) { $this->spec=$spec; $this->orSpec=$orSpec; function isSatisfiedBy($datasource) { return ($this->spec->isSatisfiedBy($datasource) || $this->orSpec->isSatisfiedBy($datasource)); } |
ÀûÓÃÒѾ¸ø³öµÄ“Âß¼”¹æ·¶ºÍ×î³õµÄһЩ¹æ¹æ·¶¼¯ºÏ£¬Äã¿ÉÒÔʵÏÖһЩ¸´ÔÓµÄÑéÖ¤¡£
| class PolicyFactory { public function createJasonPolicy() { $name_jason=new FieldEqualSpecification(‘name’, ‘Jason’); $age_at_least_thirty= new FieldGreaterThanOrEqualSpecification(‘age’, 30); $male=new FieldEqualSpecification(‘sex’, ‘male’); $jasons_email=new OrSpecification( new FieldEqualSpecification(‘email’, ‘jsweat_php@yahoo.com’) , new FieldEqualSpecification(‘email’, ‘jsweat@users.sourceforge.net’)); return new AndSpecification( $name_jason, new AndSpecification( $age_at_least_thirty, new AndSpecification($male, $jasons_email) )); } } |
Ò»¿ªÊ¼£¬²ßÂÔ¹¤³§¿´ÆðÀ´ÓеãÁãÂÒ£¬Ö÷ÒªÊÇÒòΪÁÙʱ±äÁ¿µÄÊýÁ¿×èÖ¹Á˵¥¸ö¾ßÌ广·¶µÄʵÀý»¯¡£È»¶ø£¬´úÂëÖÐ×îÓÐȤµÄ²¿·ÖÊÇʹÓûò¹æ·¶£¨OrSpecification£©ºÍÓë¹æ·¶£¨AndSpecification£©ÀࣨÔÚÉÏÃæ¸ßÁÁÏÔʾÁË£©¡£¶Ôemail½øÐÐFieldEqualSpecification×ֶεȼ۹淶µÄÁ½¸öʵÀý»¯¶¼±»µ±×÷²ÎÊý´«µÝµ½»ò¹æ·¶£¨OrSpecification£©µÄ¹¹Ôì·½·¨ÖС£ÒòΪ»ò¹æ·¶£¨OrSpecification£©Ö´ÐÐÁ˹淶½Ó¿Ú£¬Õâ¸ö$jasons_email¶ÔÏó¿ÉÒÔÏóÈÎºÎÆäËû¾ßÌåµÄ¹æ·¶ÊµÀýÒ»Ñù´¦Àí¡£ÊÂʵÉÏ£¬ÔÚ4ÐкóËüÔÚÓÖ°´ÕÕͬÑùµÄ·½Ê½±»Ê¹Ó㬾ßÌåÔÚnew AndSpecification($male, $jasons_email)¡£
ʹÓÃÉÏÃæ¸ø³öµÄ·½·¨Æ÷PolicyFactor£¨ÉÏÃæµÄPolicyFactory£©£¬ÎÒÃÇ¿ÉÒÔ×öµ½£º
| $jason=PolicyFactory::createJasonPolicy(); $jason->isSatisfiedBy($datasource); |
ÕâÁ½ÐдúÂëÓÃÓÚÑéÖ¤Êý¾ÝÔ´$datasourceµÄname×ֶεÄÖµÊÇ·ñÊÇ“jason”£¬ËüµÄage×ֶεÄÖµÊÇ·ñÖÁÉÙ´óÓÚ30¶øÇÒËüµÄemailÊÇ·ñÊÇjsweat_php@yahoo.com»òÕßjsweat@users.sourceforge.net¡£
´ÓÉóÃÀ¹ÛµãÉÏÀ´Ëµ£¬ËùÓÐÔÚ¹¹½¨¾ßÌ广·¶¹ý³ÌÖÐËù³öÏÖµÄÖмä±äÁ¿¶¼ÊÇÁîÈ˲»¸ßÐ˵ġ£ÄÇô£¬ÓÐûÓз½·¨À´Çå³ýÕâЩÖмä±äÁ¿Ê¹µÃ´úÂë¸ü¼ÓÈÝÒ×¶ÁºÍά»¤£¿Êǵ쬵±È»ÓУ¡¼òµ¥µÄÀûÓÃPHP5µÄÒ»¸öÐÂÌØÕ÷À´Á´½Óµ½¶ÔÏóµÄ·½·¨²¢·µ»ØÕâ¸ö·½·¨¡£
¾ßÌå·½·¨µÄµÚÒ»²½¿ÉÄÜÊÇÔÊÐíµ¥¸ö¾ßÌåµÄ¹æ·¶ÖªµÀÈçºÎ“Ó딺͓»ò”Ëü×ÔÉí¡£Õâ¿ÉÒÔͨ¹ýÒýÈëFactory·½·¨£¨¾ßÌåÇë¿´µÚÈýÕ——¹¤³§·½·¨Ä£Ê½£©À´´´½¨»ò¹æ·¶£¨OrSpecification£©ºÍÓë¹æ·¶£¨AndSpecification£©¶ÔÏó¡£ÓÉÓÚÕâÐ©ÌØµã¶ÔËùÓеĹ淶À´Ëµ¶¼ÊÇͨÓõģ¬ËùÒÔ°ÑËüÃÇ·â×°µ½Ò»¸ö³éÏóµÄ»ùÀàÀï¾ø¶ÔÊǸöºÜºÃµÄÖ÷Òâ¡£
| abstract class BaseSpecification implements Specification { protected $field; public function and_($spec) { return new AndSpecification($this, $spec); } public function or_($spec) { return new OrSpecification($this, $spec); } } |
ÕâÓÐȤµÄ·½·¨Ãû×Öadd_()ºÍor_()ÊDZØÐëµÄ£¬ÒòΪ”add”ºÍ”or”ÔÚPHPÖÐÊǹؼü×Ö¡£
ͨ¹ýÒýÈëÕâ¸ö»ùÀ࣬ÄÇЩÔÚÇ°ÃæÊéдµÄ¾ßÌåµÄÀà¶¼±ØÐëÐ޸쬵ÃÈÃËüÃǶ¼¼Ì³ÐÓÚBaseSpecification£º
|
class FieldEqualSpecification extends BaseSpecification { // ...} |
½ÓÏÂÀ´ÒªÒýÈëFactory·½·¨À´¸ü¼ÓÈÝÒ׵Ĵ´½¨µ¥¸ö¾ßÌåµÄ¹æ·¶Àà¡£Õâ¿ÉÄÜ»áÔÚµ¥¶ÀµÄfactoryÀàÀïÃæÊµÏÖ£¬µ«ÊÇΪÁ˸ü¼Ó·½±ã£¬Äã¿ÉÒÔ°ÑÕâ¸ö·½·¨Ôö¼Óµ½PolicyFactoryÀàÀïÃæ¡£
| class PolicyFactory { protected function equal($field, $value) { return new FieldEqualSpecification($field, $value); } protected function gTorEq($field, $value) { return new FieldGreaterThanOrEqualSpecification($field, $value); } } |
ÏÖÔÚ£¬ÈÃÎÒÃÇÁªºÏÕâЩËùÓеÄFactory·½·¨À´´´½¨Ò»¸ö×ÛÊö£¬¾ÍÏóÏÂÃæÏÔʾµÄÒ»Ñù£º
| class PolicyFactory { // .. public function createJasonPolicy() { return $this->equal(‘name’, ‘Jason’)->and_( $this->gTorEq(‘age’, 30)->and_( $this->equal(‘sex’, ‘male’)->and_( $this->equal(‘email’, ‘jsweat_php@yahoo.com’)->or_( $this->equal(‘email’, ‘jsweat@users.sourceforge.net’) )))); } } |
¾ÍºÍÇ°ÃæÒ»Ñù£¬·½·¨createJasonPolicy()´´½¨ÁËÒ»¸ö²ßÂÔ£¨Policy£©,µ«ÊÇÕâ´úÂëµÄ¿É¶ÁÐԺúܶàÁË¡£
ÔÚ¾¹ýËùÓеÄÖØ×éºó£¬ÀàµÄͼ±í¾ÍÈçÏÂËùʾ£º
¹æ·¶Ä£Ê½ÄÜÈÃÄãÔÚÓ¦ÓóÌÐòÀï¸ü¼ÓÈÝÒ×µÄ×éÖ¯ºÍ¼Ü¹¹ÄãµÄÉÌÒµÂß¼¡£ÎÒ°ÑÕâ¸öģʽ°üº¬ÔÚÕâ±¾ÊéÀïÃæµÄÒ»¸öÔÒò¾ÍÊÇÒòΪËü¿ªÊ¼ÏÔʾÁËÔÚÕæÕýµÄÏÔʾÊÀ½çÓ¦ÓÃÖÐģʽÊÇÈçºÎÐ޸ĺÍ×éºÏµÄ¡£
ÒÔÉÏËù·ÖÏíµÄÊǹØÓÚ¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚʮՠ¹æ·¶Ä£Ê½£¬ÏÂÃæÊDZà¼ÎªÄãÍÆ¼öµÄÓмÛÖµµÄÓû§»¥¶¯£º
¡¡¡¡Ïà¹ØÎÊÌ⣺±à³ÌÉè¼ÆÄ£Ê½,23ÖÖÉè¼ÆÄ£Ê½Ôõôѧ°¡,ÐèÒªÄÇÖÖͨË×...
¡¡¡¡´ð£ºÍ¨Óñà³ÌÉè¼ÆÄ£Ê½¹²23ÖÖ-Ò×ѧƪ 1¡¢¹¤³§Ä£Ê½-×·MMÉÙ²»ÁËÇë³Ô·¹ÁË,Âóµ±À͵靈áºÍ¿ÏµÂ»ùµÄ¼¦³á¶¼ÊÇMM°®³ÔµÄ¶«Î÷,ËäÈ»¿ÚζÓÐËù²»Í¬,µ«²»¹ÜÄã´øMMÈ¥Âóµ±ÀÍ»ò¿ÏµÂ»ù,Ö»¹ÜÏò·þÎñԱ˵¡±À´Ëĸö¼¦³á¡±¾ÍÐÐÁË.Âóµ±ÀͺͿϵ»ù¾ÍÊÇÉú²ú¼¦³áµÄ 2¡¢½¨Ôìģʽ-MM... >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺PHPÓÐÄļ¸ÖÖÉè¼ÆÄ£Ê½£¿
¡¡¡¡´ð£ºPHP Ò»°ãÓÐÎåÖÖ³£¼ûµÄÉè¼ÆÄ£Ê½ ¹¤³§Ä£Ê½ ¹¤³§Ä£Ê½ ÊÇÒ»ÖÖÀ࣬Ëü¾ßÓÐΪÄú´´½¨¶ÔÏóµÄijЩ·½·¨¡£Äú¿ÉÒÔʹÓù¤³§Àà´´½¨¶ÔÏ󣬶ø²»Ö±½ÓʹÓà new¡£ÕâÑù£¬Èç¹ûÄúÏëÒª¸ü¸ÄËù´´½¨µÄ¶ÔÏóÀàÐÍ£¬Ö»Ðè¸ü¸Ä¸Ã¹¤³§¼´¿É¡£Ê¹Óøù¤³§µÄËùÓдúÂë»á×Ô¶¯¸ü¸Ä¡£ ÀýÈç... >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺PHPµÄµ¥Ì¬Éè¼ÆÄ£Ê½
¡¡¡¡´ð£º¶ÔÓÚjavaת¹ýÀ´³ÌÐòԱ˵Êǵ¥Ì¬Éè¼ÆÄ£Ê½£¬ÔÚPHPÉÏͨ³£ËµÊǵ¥Àýģʽ£¬Ëµ·¨²»Ò»Ñù£¬ÊÖ²áÉÏÒ²ÓнéÉÜ£º µ¥Àýģʽ£¨Singleton£©ÓÃÓÚΪһ¸öÀàÉú³ÉÒ»¸öΨһµÄ¶ÔÏó¡£×î³£Óõĵط½ÊÇÊý¾Ý¿âÁ¬½Ó¡£ ʹÓõ¥ÀýģʽÉú³ÉÒ»¸ö¶ÔÏóºó£¬¸Ã¶ÔÏó¿ÉÒÔ±»ÆäËüÖÚ¶à¶ÔÏóËù... >>Ïêϸ
- ÆÀÂÛÁÐ±í£¨ÍøÓÑÆÀÂÛ½ö¹©ÍøÓѱí´ï¸öÈË¿´·¨£¬²¢²»±íÃ÷±¾Õ¾Í¬ÒâÆä¹Ûµã»ò֤ʵÆäÃèÊö£©
-
