»¶ÓÄú·ÃÎÊÎÒ°®IT¼¼ÊõÍø£¬½ñÌìС±àΪÄã·ÖÏíµÄ±à³Ì¼¼ÊõÊÇ£º¡¾¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚÊ®ÈýÕ ÊÊÅäÆ÷ģʽ¡¿£¬ÏÂÃæÊÇÏêϸµÄ·ÖÏí£¡
¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚÊ®ÈýÕ ÊÊÅäÆ÷ģʽ
½Ó¿ÚµÄ¸Ä±ä£¬ÊÇÒ»¸öÐèÒª³ÌÐòÔ±ÃDZØÐ루ËäÈ»ºÜ²»ÇéÔ¸£©½ÓÊܺʹ¦ÀíµÄÆÕ±éÎÊÌâ¡£³ÌÐòÌṩÕßÃÇÐÞ¸ÄËûÃǵĴúÂë;ϵͳ¿â±»ÐÞÕý;¸÷ÖÖ³ÌÐòÓïÑÔÒÔ¼°Ïà¹Ø¿âµÄ·¢Õ¹ºÍ½ø»¯¡£ÎÒº¢×ÓµÄÎÞÊýÍæ¾ßÖÐÓÐÒ»¸ö¼òÒªµØÃèÊöÁËÕâ¸öÁ½ÄѾÖÃæ£ºÄãÎÞ·¨ºÏÀí°²ÅÅÒ»¸ö²»µÃÆäËùµÄÈË¡£
ÎÊÌâ
ÄãÈçºÎ±ÜÃâÒòÍⲿ¿âµÄAPI¸Ä±ä¶ø´øÀ´µÄ²»±ã£¿¼ÙÈçÄãдÁËÒ»¸ö¿â£¬ÄãÄÜ·ñÌṩһÖÖ·½·¨ÔÊÐíÄãÈí¼þµÄÏÖÓÐÓû§½øÐÐÍêÃÀµØÉý¼¶£¬¼´Ê¹ÄãÒѾ¸Ä±äÁËÄãµÄAPI£¿ÎªÁ˸üºÃµØÊÊÒËÓÚÄãµÄÐèÒª£¬ÄãÓ¦¸ÃÈçºÎ¸Ä±äÒ»¸ö¶ÔÏóµÄ½Ó¿Ú£¿
½â¾ö·½°¸
ÊÊÅäÆ÷(Adapter)ģʽΪ¶ÔÏóÌṩÁËÒ»ÖÖÍêÈ«²»Í¬µÄ½Ó¿Ú¡£Äã¿ÉÒÔÔËÓÃÊÊÅäÆ÷(Adapter)À´ÊµÏÖÒ»¸ö²»Í¬µÄÀàµÄ³£¼û½Ó¿Ú£¬Í¬Ê±±ÜÃâÁËÒòÉý¼¶ºÍ²ð½â¿Í»§´úÂëËùÒýÆðµÄ¾À·×¡£
¿¼ÂÇһϵ±(²»ÊǼÙÉ裡)Ò»¸öµÚÈý·½¿âµÄAPI¸Ä±ä½«»á·¢Éúʲô¡£¹ýÈ¥ÄãÖ»ÄÜÊÇÒ§½ôÑÀ¹ØÐÞ¸ÄËùÓеĿͻ§´úÂ룬¶øÇé¿öÍùÍù»¹²»ÄÇô¼òµ¥¡£Äã¿ÉÄÜÕý´ÓÊÂÒ»ÏîеÄÏîÄ¿£¬ËüÒªÓõ½Ð°汾µÄ¿âËù´øÀ´µÄÌØÐÔ£¬µ«ÄãÒѾӵÓÐÐí¶à¾ÉµÄÓ¦ÓóÌÐò£¬²¢ÇÒËüÃÇÓëÒÔǰ¾É°æ±¾µÄ¿â½»»¥ÔËÐеغܺá£Ä㽫ÎÞ·¨Ö¤Ã÷ÕâЩÐÂÌØÐÔµÄÀûÓüÛÖµ£¬Èç¹ûÕâ´ÎÉý¼¶Òâζ׎«ÒªÉæ¼°µ½ÆäËüÓ¦ÓóÌÐòµÄ¿Í»§´úÂë¡£
×¢£º¿ØÖÆÌåģʽ
ÊÊÅäÆ÷(Adapter)ģʽÊÇ¿ØÖÆÌåģʽµÄ×îз¶Àý¡£Ò»¸öÊÊÅäÆ÷(Adapter)µÄ½á¹¹ÀàËÆÓÚ´úÀí·þÎñÆ÷(Proxy)ºÍÐÞÊÎÆ÷(Decorator),¶øËüÃǵIJ»Í¬Ö®´¦ÔÚÓÚ£¬ÊÊÅäÆ÷(Adapter)µÄÄ¿µÄÊǸıä·â×°ÀàµÄ½Ó¿Ú£¬´úÀí·þÎñÆ÷(Proxy)ºÍÐÞÊÎÆ÷(Decorator)ÔòÊDZ£³Ö½Ó¿Ú²»±ä¡£
Ñù±¾´úÂë
ÈÃÎÒÃÇ¿´¿´µ±API¸Ä±äʱ£¬ÈçºÎ±£»¤Ó¦ÓóÌÐò²»ÊÜÓ°Ïì¡£
¼ÙÉèÄã·Ñ¾¡ÐÄ˼ѰÕÒºÏÊʵĿ⣬×îºóÖÕÓÚÕÒµ½ÁËHwLib£¬Ò»¸ö(¼ÙÉèµÄ)±»Éè¼ÆÓÃÀ´·¢ËÍÐÅÏ¢µÄ´úÂ뼯¡£
ÏÂÃæÊÇHwLibÀàµÄÔ´´úÂ룺
| // PHP4 class HwLib { function hello() { return ‘Hello ‘; } function world() { return ‘World!’; } } |
ÏÂÃæÊÇ¿âÔËÐеķ¶Àý£º
| $hw =& new HwLib; echo $hw->hello(), $hw->world(); |
HwLibÓÐÍ걸µÄ˵Ã÷Îĵµ¡£ÔÚÎĵµÖÐ×÷ÕßÒѾÃ÷È·Ö¸³öhello()·½·¨»áÔÚδÀ´µÄ°æ±¾Öв»±»Ö§³Ö(ÉõÖÁÌÔÌ)¡£
½ÓÏÂÀ´£¬ÏÖÔÚ¼ÙÉèµÚ¶þ°æµÄHwLibÒѾ·¢²¼¡£Ò»¸öȫеÄgreet()·½·¨´úÌæÁËhello()¡£
ÏÂÃæÊÇÕâ¸ö¿âµÄа汾(×¢ÊÍÒѱ»³éÈ¡µô)£º
| // version 2 class HwLib { function greet() { return ‘Greetings and Salutations ‘; } unction world() { return ‘World!’; } } |
ΪÁËÊÊÓ¦HwLibµÄ²»Í¬°æ±¾½øÐбàÂ룬ÏȽøÐÐһЩ»ùÓÚµÚÒ»°æ±¾HwLib½Ó¿ÚµÄ²âÊÔ£º
| class AdapterTestCase extends UnitTestCase { function TestOriginalApp() { $lib =& new HwLib; $this->assertEqual( ‘Hello World!’ ,$lib->hello().$lib->world()); } } |
ÄãͬÑù¿ÉÒÔ±íÃ÷£¬¶ÔÕâ¸ö¿âµÄ¼òµ¥Éý¼¶½«Ôì³É´ËÓ¦ÓóÌÐòµÄʧЧ¡£
| class AdapterTestCase extends UnitTestCase { function TestOriginalAppWouldFail() { $lib =& new HwLib; // now using HwLib version 2 $this->assertFalse(method_exists($lib, ‘hello’)); } } |
(Õâ¸ö²âÊÔÒÔmethod_exists()ΪÀýÖ¤¡£Èç¹ûÄã¼òµ¥µØ¸ü»»Õâ¸ö¿âµÄµÚ¶þ°æ±¾²¢ÇÒÒÔTestOriginalApp()µÄ²âÊÔÔÙ´ÎÔËÐÐAdapterTestCase£¬PHP¾Í»áÔËÐÐʧ°Ü£¬Í¬Ê±±¨¸æ“ÖÂÃü´íÎó£ºÎ´¶¨ÒåµÄº¯Êý£ºhello()”)
Õë¶ÔAPI“Éý¼¶”µÄ½â¾ö°ì·¨¾ÍÊÇ´´½¨Ò»¸öÊÊÅäÆ÷(Adapter)¡£
µÚÒ»²½ÊÇ»ñµÃµÚ¶þ°æ±¾HwLibµÄʵÀýµÄÒ»¸öÒýÓ㬲¢ÇÒ°ÑËü¼ÓÈëµ½ÄãµÄAdapterÀàÖС£
| class HwLibV2ToV1Adapter { var $libv2; function HwLibV2ToV1Adapter (&$libv2) { $this->libv2 =& $libv2; } } |
Õâ¸ö·¶ÀýչʾÁ˽«Õâ¸öʵÀý´«µÝ¸ø¹¹Ô캯ÊýµÄ¹ý³Ì£¬ÄãÒ²¿ÉÒÔÔËÓÃFactory »ò Singleton £¬»òÕ߯äËüÊʺÏÄãÒªÇóµÄ´´½¨Ä£Ê½£¬À´´´½¨Ò»¸öеÄʵÀý¡£(ͨ¹ýǰÁ½Õ£¬ÄãÓ¦¸Ã¶ÔHwLibV2ToV1AdapterµÄ±àдÓÃ;ºÜÊìϤÁË)
µ±µÃµ½µÚ¶þ°æ±¾HwLibµÄʱºò£¬ÄãÈçºÎʹËüÔÚµÚÒ»°æ±¾HwLibµÄʵÀýÖÐÌåÏÖ£¿
| class HwLibV2ToV1Adapter { var $libv2; function HwLibV2ToV1Adapter (&$libv2) { $this->libv2 =& $libv2; } function hello() { return $this->libv2->greet(); } function world() { return $this->libv2->world(); } } |
HwLibV2ToV1Adapter::hello()·½·¨´ú±íÁË$libv2¶ÔÏóµÄgreet()·½·¨¡£
½Ó×Å£¬Äã¸ÃÈçºÎÔÚ³ÌÐòÖÐʹÓÃËü£¿
| class AdapterTestCase extends UnitTestCase { function TestOriginalAppWithAdapter() { $lib =& new HwLibV2ToV1Adapter(new HwLib); $this->assertEqual( ‘Greetings and Salutations World!’ ,$lib->hello().$lib->world()); } } |
¸Õ²ÅµÄ³ÌÐò²âÊÔºÍÏÖÔڵijÌÐò´úÂë¶¼ÓÐÒ»¶¨³Ì¶ÈµÄ´àÈõÐÔ¡£ÓÐûÓз½·¨ÔÚ³¤¾ÃµÄʹÓÃÖÐÈÃËüÃǶ¼¸üÒ×ÓÚά»¤ÄØ£¿µ±È»ÊÇÓеģ¡
»ØÒäÒ»ÏÂ(µÚÈýÕÂ)FactoryÊÇÈçºÎÌṩһ¸ö¸üÁé»îµÄ·½·¨À´´´½¨ÀàµÄʵÀýµÄ¡£ÎªÁ˸üºÃµØÔÚ½«À´¼ìÑéÕâЩ´úÂ룬¾Í´ÓÒ»¸ö¼òµ¥µÄFactoryº¯Êý¿ªÊ¼£º
| function &HwLibInstance() { return new HwLib; } |
ΪÁ˲âÊÔFactory,Ö±½Óµ÷ÓÃËü¶ø²»´´½¨ËüµÄʵÀý£º
| class AdapterTestCase extends UnitTestCase { function TestAppWithFactory() { $lib =& HwLibInstance(); $this->assertWantedPattern( ‘/\w+ World!$/’ ,$lib->hello().$lib->world()); } } |
ÓÐÁ½¸ö·½ÃæÐèҪעÒ⣺Factory´´½¨Á˶ÔÏ󣬶øÓÃÓÚÈ·ÈϵÄassertEqual()º¯Êý±»ÐÞ¸ÄΪ¸üÁé»îµÄassertWantedPattern()¡£ÄãÏÖÔÚ¿ÉÒÔÓÃÒ»¸öÕýÔò±í´ïʽÀ´²¶»ñÄãÔÚ¿âÖÐËùÒª²éÕҵēºËÐÄ”£¬µ«¿ÉÄÜ»áʹÕâ¸ö²âÊÔ±¾Éí±äµÃ´àÈõ¡£
½ÓÏÂÀ´£¬Éý¼¶HwLib¿â¡£µ±°²×°ÁËHwLibµÚ¶þ°æ£¬Äã¾Í¿ÉÒÔÐÞ¸ÄHwLibInstance()º¯ÊýÀ´ÊÊӦеİ汾¡£
| function &HwLibInstance($ver=false) { switch ($ver) { case ‘V2’: return new HwLib; default: return new HwLibV2ToV1Adapter(new HwLib); } } |
ÏÖÔÚÖØÐÂÔËÐÐAdapterTestCase¡£²âÊÔͨ¹ý£¡(ÂÌÉ«½ø¶ÈÌõÕý³£¡£)ÒòΪÔʼµÄ³ÌÐòûÓд«µÝÒ»¸ö²ÎÊý£¬HwLibInstance»áĬÈÏ·µ»Ø·â×°ÔÚHwLibV2toV1AdapterÖеÄHwLibµÄÒ»¸öʵÀý¡£¾¡¹ÜÈç´Ë£¬Èç¹ûÄã±àдÁËеĴúÂ룬Äã¿ÉÒÔ´«µÝ½øÒ»¸ö“V2”µÄ²ÎÊýÈÃÕâ¸öº¯Êý×Ô¶¯Ñ¡ÔñHwLibµÄа汾¶ø²»ÓÃÈ¥µ÷ÕûËü¡£
ÒÔºó£¬Èç¹ûÄãÑ¡ÔñÉý¼¶HwLibµÄµÚÈý°æ£¬Ó¦¸Ã½«Factory×öÈçϵĵ÷Õû£º
| function &HwLibInstance($ver=false) { switch ($ver) { case ‘V3’: return new HwLib; case ‘V2’: return new HwLibV3ToV2Adapter(new HwLib); default: return new HwLibV2ToV1Adapter( new HwLibV3ToV2Adapter(new HwLib)); } } |
×ܽá
ÈçÀýÖдúÂëËùʾ£¬Äã¿ÉÒÔÔËÓÃÊÊÅäÆ÷(Adapter)ģʽÀ´±ÜÃâÒòÍⲿ¿â¸Ä±äËù´øÀ´µÄ²»±ã——ÌÈÈôÏòÉϼæÈÝ¡£×÷Ϊij¸ö¿âµÄ¿ª·¢Õߣ¬ÄãÓ¦¸Ã¶ÀÁ¢±àдÊÊÅäÆ÷£¬Ê¹ÄãµÄÓû§¸ü¼ò±ãµØÊ¹ÓÃа汾µÄ¿â£¬¶ø²»ÓÃÈ¥ÐÞ¸ÄËûÃÇÏÖÓеÄÈ«²¿´úÂë¡£
GoFÊéÖÐÌá³öµÄÊÊÅäÆ÷(Adapter)ģʽ¸üÇãÏòÓÚÔËÓü̳жø²»ÊÇ×é³É¡£ÕâÔÚÇ¿ÀàÐÍÓïÑÔÖÐÊÇÓÐÀûµÄ£¬ÒòΪÊÊÅäÆ÷(Adapter)ÊÂʵÉÏÊÇÒ»¸öÄ¿±êÀàµÄ×ÓÀ࣬Òò¶øÄܸüºÃµØÓëÀàÖз½·¨Ïà½áºÏ¡£
ÏÂÃæÊÇHwLibÊÊÅäÆ÷ÔËÓü̳еķ¶Àý£º
class HwLibGofAdapter extends HwLib { // extending version 2.0
function hello() {
return parent::greet();
}
}
world()·½·¨Ã»ÓÐÔÚÀàÖÐÌáµ½£¬ÒòΪÔËÓÃÁ˼̳У¬ËüÒѾÊÇ×ÓÀàµÄÒ»²¿·Ö¡£
class AdapterTestCase extends UnitTestCase {
function TestHwLibGofAdapter() {
$lib =& new HwLibGofAdapter;
$this->assertEqual(
‘Greetings and Salutations World!’
,$lib->hello().$lib->world());
}
}
ΪÁ˸üºÃµÄÁé»îÐÔ£¬ÎÒ¸öÈ˱ȽÏÇãÏòÓÚ×é³ÉµÄ·½·¨(ÌØ±ðÊÇÔÚ½áºÏÁËÒÀÀµÐÔµ¹ÖõÄÇé¿öÏÂ);¾¡¹ÜÈç´Ë£¬¼Ì³ÐµÄ·½·¨ÌṩÁ½ÖÖ°æ±¾µÄ½Ó¿Ú£¬»òÐíÔÚÄãµÄʵ¼ÊÔËÓÃÖз´¶øÊÇÒ»¸öÌá¸ßÁé»îÐԵĹؼü¡£
?×¢£ºÒÀÀµÐÔµ¹ÖÃÔÀí
ÒÀÀµÐÔµ¹ÖÃÔÀí(Ê×ÏÈÔÚhttp://www.objectmentor.com/resources/articles/dip.pdfÖÐÓÉRobert C. MartinÌá³ö)ÊÇÒ»¸öÃæÏò¶ÔÏó±à³ÌµÄ×¼Ôò£¬Ëü±íÃ÷£º¸ß²ã´ÎµÄÄ£¿é²»Ó¦¸ÃÒÀÀµÓڵͲã´ÎµÄÄ£¿é£¬¶øÓ¦ÒÀÀµÓÚ³éÈ¡¡£Ò»¸ö¼òµ¥µÄÓëÊÊÅäÆ÷(Adapter)ģʽÏà½áºÏµÄÒÀÀµÐÔµ¹ÖÃÔÀí·¶Àý¿ÉÒÔÔÚÒÔϵØÖ·ÖÐÕÒµ½£º
http://www.phplondon.org/wiki/DependencyInversion
ÊÊÅäÆ÷ģʽµÄÖØµãÊǸıäÒ»¸öµ¥¶ÀÀàµÄAPI¡£ÓÐÒ»¸öÓëÖ®Ïà¹ØµÄÉè¼ÆÄ£Ê½(±¾ÊéÖÐûÓк¸Ç)£¬³Æ×÷ÕýÃæ(Facade)ģʽ¡£ÕýÃæ(Facade)µÄÄ¿µÄÊǸøÓÉÐí¶à¶ÔÏ󹹳ɵÄÕû¸ö×Óϵͳ£¬Ìṩ¸üΪ¼ò½àµÄ½Ó¿Ú——·´¹ýÀ´¾ÍÊÇ·â×°Ò»¸öµ¥¶ÀÀà——¿ÉÄÜÊÇÒ»¸öÖµµÃÑо¿µÄģʽ£¬Èç¹ûÄãÕýÉè·¨°ÑÄãµÄ´úÂëÓëµÚÈý·½¿â¸ôÀ뿪À´µÄ»°¡£
ÒÔÉÏËù·ÖÏíµÄÊǹØÓÚ¡¶PHPÉè¼ÆÄ£Ê½½éÉÜ¡·µÚÊ®ÈýÕ ÊÊÅäÆ÷ģʽ£¬ÏÂÃæÊDZà¼ÎªÄãÍÆ¼öµÄÓмÛÖµµÄÓû§»¥¶¯£º
¡¡¡¡Ïà¹ØÎÊÌ⣺ʵÏÖ½Ó¿Úת»»µÄÉè¼ÆÄ£Ê½ÊÇ a²ßÂÔģʽbµ¥¼þģʽcÊÊ...
¡¡¡¡´ð£ºC ÊÊÅäÆ÷ģʽ ÊÊÅäÆ÷ģʽ,ÊôÓڽṹÐÍģʽ,ÆäÖ÷Òª×÷ÓÃÊǽ«Ò»¸öÀàµÄ½Ó¿Úת»»³É¿Í»§Ï£ÍûµÄÁíÍâÒ»¸ö½Ó¿Ú¡£ÊÊÅäÆ÷ģʽʹµÃÔ±¾ÓÉÓÚ½Ó¿Ú²»¼æÈݶø²»ÄÜÒ»Æð¹¤×÷µÄÄÇЩÀà¿ÉÒÔÒ»Æð¹¤×÷¡£... >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺23ÖÐÉè¼ÆÄ£Ê½ÖÐÓÐÒ»ÖÖÊÊÅäÆ÷ģʽ£¬ÓÐûÓÐÈ˰ïæ»...
¡¡¡¡´ð£ºÄÄÀïÀ´µÄʱÐòͼ.Ààͼµ¹ÊÇÓÐ >>Ïêϸ
¡¡¡¡Ïà¹ØÎÊÌ⣺javaÉè¼ÆÄ£Ê½Ö®×°ÊÎģʽÊÊÅäÆ÷ģʽµÄÒÉ»ó
¡¡¡¡´ð£ºprivate ·½·¨¶ÔÓÚÍⲿÀàÀ´Ëµ¶¼ÊDz»¿É¼ûµÄ£¬Ò²¾ÍÊÇ˵ÕâÀïBufferedInputStreamÔö¼ÓµÄ¼¸¸ö˽Óз½·¨Íâ½çÊÇÎÞ·¨»ñÖªµÄ£¬ËùÒÔÍâ½çÊÇÎÞ·¨²ì¾õµÄ£»ÒòΪװÊÎÀàºÍÔʼÀ࣬ÎÒÃÇËù¿´µ½µÄËûÃǵĹ²Óз½·¨¶¼ÊÇÏàͬµÄ£¬ÆäʵËûÃǵÄÄÚ²¿ÊµÏÖÊDz»Í¬µÄ£¬µ«ÊÇÕâµãÎÒÃÇ... >>Ïêϸ
- ÆÀÂÛÁÐ±í£¨ÍøÓÑÆÀÂÛ½ö¹©ÍøÓѱí´ï¸öÈË¿´·¨£¬²¢²»±íÃ÷±¾Õ¾Í¬ÒâÆä¹Ûµã»ò֤ʵÆäÃèÊö£©
-
