Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Éè¼ÆÄ£Ê½¡ª¡ª¿ª·¢³£ÓõÄÉè¼ÆÄ£Ê½ÊáÀí
 
  3550  次浏览      27
 2019-1-4
 
±à¼­ÍƼö:

±¾ÎÄÀ´×Ô51cto£¬ÎÄÕÂÖ÷Òª½éÉÜÁ˲ßÂÔģʽ¡¢¹Û²ìÕßģʽ¡¢ ×°ÊÎģʽ¡¢µ¥ÀýģʽÒÔ¼°¶öººÄ£Ê½µÈµÄÏà¹ØÄÚÈÝ¡£

. »ù´¡Ñ§Ï°£ºUMLËÄÖÖ¹ØÏµ

ñîºÏ¶È´óС¹ØÏµ

·º»¯ = ʵÏÖ > ×éºÏ > ¾ÛºÏ > ¹ØÁª > ÒÀÀµ

ÒÀÀµ(Dependency)

Ò»¸öÈË(Person)¿ÉÒÔÂò³µ(car)ºÍ·¿×Ó(House)£¬ÄÇô¾Í¿ÉÒԳƣºPersonÀàÒÀÀµÓÚCarÀàºÍHouseÀà

ÕâÀï×¢ÒâÓëÏÂÃæµÄ¹ØÁª¹ØÏµÇø·Ö£ºPersonÀàÀﲢûÓÐʹÓÃCarºÍHouseÀàÐ͵ÄÊôÐÔ£¬CarºÍHouseµÄʵÀýÊÇÒÔ²ÎÁ¿µÄ·½Ê½´«Èëµ½buy()·½·¨ÖС£

ÒÀÀµ¹ØÏµÔÚJavaÓïÑÔÖÐÌåÏÖΪ¾ÖÓò±äÁ¿¡¢·½·¨µÄÐβΣ¬»òÕß¶Ô¾²Ì¬·½·¨µÄµ÷Óá£

¹ØÁª(Association£©

Ëüʹһ¸öÀàÖªµÀÁíÒ»¸öÀàµÄÊôÐԺͷ½·¨¡£

¹ØÁª¿ÉÒÔÊÇË«ÏòµÄ£¬Ò²¿ÉÒÔÊǵ¥ÏòµÄ¡£

ÔÚJavaÓïÑÔÖУ¬¹ØÁª¹ØÏµÒ»°ãʹÓóÉÔ±±äÁ¿À´ÊµÏÖ¡£

¾ÛºÏ(Aggregation)

¾ÛºÏÊǹØÁª¹ØÏµµÄÒ»ÖÖ£¬ÊÇÇ¿µÄ¹ØÁª¹ØÏµ¡£

¾ÛºÏÊÇÕûÌåºÍ¸öÌåÖ®¼äµÄ¹ØÏµ£¬µ«¸öÌå¿ÉÒÔÍÑÀëÕûÌå¶ø´æÔÚ¡£

ÀýÈ磬Æû³µÀàÓëÒýÇæÀà¡¢ÂÖÌ¥À࣬ÒÔ¼°ÆäËüµÄÁã¼þÀàÖ®¼äµÄ¹ØÏµ±ãÕûÌåºÍ¸öÌåµÄ¹ØÏµ¡£

Óë¹ØÁª¹ØÏµÒ»Ñù£¬¾ÛºÏ¹ØÏµÒ²ÊÇͨ¹ý³ÉÔ±±äÁ¿ÊµÏֵġ£µ«ÊǹØÁª¹ØÏµËùÉæ¼°µÄÁ½¸öÀàÊÇ´¦ÔÚͬһ²ã´ÎÉϵ쬶øÔھۺϹØÏµÖУ¬Á½¸öÀàÊÇ´¦ÔÚ²»Æ½µÈ²ã´ÎÉϵģ¬Ò»¸ö´ú±íÕûÌ壬ÁíÒ»¸ö´ú±í²¿·Ö¡£

×éºÏ(Composition)

×éºÏÊǹØÁª¹ØÏµµÄÒ»ÖÖ£¬ÊDZȾۺϹØÏµÇ¿µÄ¹ØÏµ£¬Ò²ÒÔ³ÉÔ±±äÁ¿µÄÐÎʽ³öÏÖ¡£

ÔÚijһ¸öʱ¿Ì£¬²¿·Ö¶ÔÏóÖ»ÄܺÍÒ»¸öÕûÌå¶ÔÏó·¢Éú×éºÏ¹ØÏµ£¬ÓɺóÕßÅÅËûµØ¸ºÔðÉúÃüÖÜÆÚ¡£

²¿·ÖºÍÕûÌåµÄÉúÃüÖÜÆÚÒ»Ñù¡£

ÕûÌå¿ÉÒÔ½«²¿·Ö´«µÝ¸øÁíÒ»¸ö¶ÔÏó£¬Õâʱºò¸Ã²¿·ÖµÄÉúÃüÖÜÆÚÓÉÐÂÕûÌå¿ØÖÆ£¬È»ºó¾ÉÕûÌå¿ÉÒÔËÀÍö¡£

. ²ßÂÔģʽ

ʲôÊDzßÂÔģʽ

Ò»¸öÀàÖеÄһЩÐÐΪ£¬¿ÉÄÜ»áËæ×ÅϵͳµÄµü´ú¶ø·¢Éú±ä»¯¡£ÎªÁËʹµÃ¸ÃÀàÂú×㿪·Å-·â±ÕÔ­Ôò£¨¼´£º¾ß±¸¿ÉÀ©Õ¹ÐÔ »ò µ¯ÐÔ£©£¬ÎÒÃÇÐèÒª½«ÕâЩδÀ´»á·¢Éú¶¯Ì¬±ä»¯µÄÐÐΪ´Ó¸ÃÀàÖаþÀë³öÀ´£¬²¢Í¨¹ýÔ¤²âδÀ´ÒµÎñ·¢Õ¹µÄ·½Ê½£¬ÎªÕâЩÐÐΪ³éÏó³ö¹²ÓеÄÌØÕ÷£¬·â×°ÔÚ³éÏóÀà»ò½Ó¿ÚÖУ¬²¢Í¨¹ýËüÃǵÄʵÏÖÀàÌṩ¾ßÌåµÄÐÐΪ¡£Ô­±¾ÀàÖÐÐèÒª³ÖÓиóéÏóÀà/½Ó¿ÚµÄÒýÓá£ÔÚʹÓÃʱ£¬½«Ä³Ò»¸ö¾ßÌåµÄʵÏÖÀà¶ÔÏó×¢Èë¸ø¸ÃÀàËù³ÖÓеĽӿÚ/³éÏóÀàµÄÒýÓá£

ÀàͼÃèÊö

Èç¹ûÀàAÖÐÓÐÁ½¸öÐÐΪXºÍY»áËæ×ÅÒµÎñµÄ·¢Õ¹¶ø±ä»¯£¬ÄÇô£¬ÎÒÃÇÐèÒª½«ÕâÁ½¸öÐÐΪ´ÓÀàAÖаþÀë³öÀ´£¬²¢Ðγɸ÷×Եļ̳ÐÌåϵ(²ßÂÔÌåϵ)¡£Ã¿¸ö¼Ì³ÐÌåϵ(²ßÂÔÌåϵ)µÄ¶¥²ã¸¸Àà/½Ó¿ÚÖж¨Òå¹²ÓÐÐÐΪµÄ³éÏóº¯Êý£¬Ã¿¸ö×ÓÀà/ʵÏÖÀàÖж¨Òå¸Ã²ßÂÔÌåϵ¾ßÌåµÄʵÏÖ¡£

ÆäÖУ¬Ã¿Ò»¸ö±»³éÏó³öÀ´µÄ¼Ì³ÐÌåϵ±»³ÆÎªÒ»¸ö²ßÂÔÌåϵ£¬Ã¿¸ö¾ßÌåµÄʵÏÖÀà±»³ÆÎª²ßÂÔ¡£

´Ëʱ£¬²ßÂÔÌåϵÒѾ­¹¹½¨Íê³É£¬½ÓÏÂÀ´ÐèÒª¸ÄÔìÀàA¡£

ÔÚÀàAÖÐÔö¼ÓËùÐè²ßÂÔÌåϵµÄ¶¥²ã¸¸Àà/½Ó¿Ú£¬²¢ÏòÍⱩ¶һ¸ö¹²Óеĺ¯Êýaction¸øµ÷ÓÃÕßʹÓá£

ÔÚSpringÏîÄ¿ÖУ¬²ßÂÔÀàºÍÀàAÖ®¼äµÄÒÀÀµ¹ØÏµ¿ÉÒÔͨ¹ýÒÀÀµ×¢ÈëÀ´Íê³É¡£

µ½´ËΪֹ£¬²ßÂÔģʽÒѾ­¹¹½¨Íê³É£¬ÏÂÃæÎÒÃÇÀ´¿´ÓÅȱµã·ÖÎö¡£

²ßÂÔģʽµÄÓŵã

1. Âú×㿪·Å·â±ÕÔ­Ôò

Èç¹ûÀàAÐèÒª¸ü»»Ò»ÖÖ²ßÂÔµÄʱºò£¬Ö»ÐèÐÞ¸ÄSpringµÄXMLÅäÖÃÎļþ¼´¿É£¬ÆäÓàËùÓеĴúÂë¾ù²»ÐèÒªÐ޸ġ£

±ÈÈ磬½«ÀàAµÄ²ßÂÔX_1¸ü»»³ÉX_2µÄ·½·¨ÈçÏ£º

<bean id="a" class="ÀàA">
<!-- ½«Ô­±¾²ßÂÔʵÏÖÀàX_1ÐÞ¸ÄΪ²ßÂÔʵÏÖÀàX_2¼´¿É -->
<property name="²ßÂÔ½Ó¿ÚX" class="²ßÂÔʵÏÖÀàX_2" />
</bean>

´ËÍ⣬Èç¹ûÐèÒªÐÂÔöÒ»ÖÖ²ßÂÔ£¬Ö»ÐèҪΪ²ßÂÔ½Ó¿ÚXÌí¼ÓÒ»¸öеÄʵÏÖÀ༴¿É£¬²¢¸²¸ÇÆäÖеÄcommonActionº¯Êý¡£È»ºó°´ÕÕÉÏÃæµÄ·½Ê½ÐÞ¸ÄXMLÎļþ¼´¿É¡£

ÔÚÕâ¸ö¹ý³ÌÖУ¬ÔÚ±£³ÖÔ­ÓÐJava´úÂë²»·¢Éú±ä»¯µÄǰÌáÏ£¬À©Õ¹ÐÔÁËÐµĹ¦ÄÜ£¬´Ó¶øÂú×㿪·Å·â±ÕÔ­Ôò¡£

2. ¿É·½±ãµØ´´½¨¾ßÓв»Í¬²ßÂԵĶÔÏó

Èç¹ûÎÒÃÇÐèÒª¸ù¾Ý²»Í¬µÄ²ßÂÔ´´½¨¶àÖÖÀàAµÄ¶ÔÏó£¬ÄÇôʹÓòßÂÔģʽ¾ÍÄܺÜÈÝÒ×µØÊµÏÖÕâÒ»µã¡£

±ÈÈ磬ÎÒÃÇÒª´´½¨Èý¸öAÀàµÄ¶ÔÏó£¬a¡¢b¡¢c¡£ÆäÖУ¬aʹÓòßÂÔX_1ºÍY_1£¬bʹÓòßÂÔX_2ºÍY_2£¬cʹÓòßÂÔX_3ºÍY_3¡£

Òª´´½¨ÕâÈý¸ö¶ÔÏó£¬ÎÒÃÇÖ»ÐèÔÚXMLÖÐ×÷ÈçÏÂÅäÖü´¿É£º

<bean id="a" class="ÀàA">
<property name="²ßÂÔ½Ó¿ÚX" class="²ßÂÔʵÏÖÀàX_1" />
<property name="²ßÂÔ½Ó¿ÚY" class="²ßÂÔʵÏÖÀàY_1" />
</bean>
<bean id="b" class="ÀàA">
<property name="²ßÂÔ½Ó¿ÚX" class="²ßÂÔʵÏÖÀàX_2" />
<property name="²ßÂÔ½Ó¿ÚY" class="²ßÂÔʵÏÖÀàY_2" />
</bean>
<bean id="c" class="ÀàA">
<property name="²ßÂÔ½Ó¿ÚX" class="²ßÂÔʵÏÖÀàX_3" />
<property name="²ßÂÔ½Ó¿ÚY" class="²ßÂÔʵÏÖÀàY_3" />
</bean>

´ðÒÉ

ÎÊ£ºÈçºÎʵÏÖ²¿·Ö¼Ì³Ð£¿Ò²¾ÍÊÇÀàSon1Ö»¼Ì³ÐFatherµÄÒ»²¿·Ö¹¦ÄÜ£¬Son2¼Ì³ÐFatherµÄÁíÒ»²¿·Ö¹¦ÄÜ¡£

ÕâÊÇÉè¼ÆÉϵÄȱÏÝ£¬µ±³öÏÖÕâÖÖÇé¿öʱ£¬Ó¦µ±½«¸¸ÀàÔٴβð·Ö³É2¸ö×ÓÀ࣬±£Ö¤ÈκÎÒ»¸ö¸¸ÀàµÄÐÐΪºÍÌØÕ÷¾ùÊǸü̳ÐÌåϵÖй²Óеģ¡

ÎÊ£ºËæ×ÅÐèÇóµÄ±ä»¯£¬¸¸ÀàÖÐÐèÒªÔö¼Ó¹²ÓÐÐÐΪʱÔõô°ì£¿Õâ¾ÍÆÆ»µÁË¡°¿ª·Å·â±ÕÔ­Ôò¡±¡£

Õâ²¢Î´ÆÆ»µ¡°¿ª·Å·â±ÕÔ­Ôò¡±£¡ÔÚϵͳµü´ú¸üеĹý³ÌÖУ¬ÐÞ¸ÄÔ­ÓеĴúÂëÊÇÔÚËùÄÑÃâµÄ£¬Õâ²¢²»Î¥±³¡°¿ª·Å·â±ÕÔ­Ôò¡±¡£

¡°¿ª·Å·â±ÕÔ­Ôò¡±ÒªÇóÎÒÃÇ£ºµ±ÏµÍ³ÔÚµü´ú¹ý³ÌÖУ¬µÚÒ»´Î³öÏÖijһÀàÐ͵ÄÐèÇóʱ£¬ÊÇÔÊÐíÐ޸ĵģ»ÔÚ´Ëʱ£¬Ó¦¸Ã¶Ôϵͳ½øÐÐÐ޸쬲¢½øÐкÏÀíµØÉè¼Æ£¬ÒÔ±£Ö¤¶Ô¸ÃÀàÐÍÐèÇóµÄÔÙ´ÎÐ޸ľ߱¸¿ÉÀ©Õ¹ÐÔ¡£µ±ÔÙÒ»´Î³öÏÖ¸ÃÀàÐ͵ÄÐèÇóʱ£¬¾Í²»Ó¦¸ÃÐÞ¸ÄÔ­ÓдúÂ룬ֻÔÊÐíͨ¹ýÀ©Õ¹À´Âú×ãÐèÇó¡£

. ¹Û²ìÕßģʽ

¹Û²ìÕßģʽÊÇʲô

Èç¹û³öÏÖÈçϳ¡¾°ÐèÇóʱ£¬¾ÍÐèҪʹÓù۲ìÕßģʽ¡£

Èç¹û´æÔÚһϵÁÐÀ࣬ËûÃǶ¼ÐèÒªÏòÖ¸¶¨Àà»ñȡָ¶¨µÄÊý¾Ý£¬µ±»ñÈ¡µ½Êý¾ÝºóÐèÒª´¥·¢ÏàÓ¦µÄÒµÎñÂß¼­¡£ÕâÖÖ³¡¾°¾Í¿ÉÒÔÓù۲ìÕßģʽÀ´ÊµÏÖ¡£

ÔÚ¹Û²ìÕßģʽÖУ¬´æÔÚÁ½ÖÖ½ÇÉ«£¬·Ö±ðÊÇ£º¹Û²ìÕߺͱ»¹Û²ìÕß¡£±»¹Û²ìÕß¼´ÎªÊý¾ÝÌṩÕß¡£ËûÃdzʶà¶ÔÒ»µÄ¹ØÏµ¡£

ÀàͼÃèÊö

±»¹Û²ìÕßÊÇÊý¾ÝÌṩ·½£¬¹Û²ìÕßÊÇÊý¾Ý»ñÈ¡·½

Ò»¸öÆÕͨµÄÀ࣬Èç¹ûÒª³ÉΪ¹Û²ìÕߣ¬»ñȡָ¶¨µÄÊý¾Ý£¬Ò»¹²ÐèÒªÈçϼ¸²½£º

Ê×ÏÈ£¬ÐèҪʵÏÖObserver½Ó¿Ú£¬²¢ÊµÏÖupdateº¯Êý£»

È»ºó£¬Ôڸú¯ÊýÖж¨Òå»ñÈ¡Êý¾ÝºóµÄÒµÎñÂß¼­£»

update(Observable, Object)Ò»¹²ÓÐÁ½¸ö²ÎÊý£º

Observable£º±»¹Û²ìÕß¶ÔÏó£¨Êý¾ÝÌṩ·½£©

Object£ºÊý¾Ý±¾Éí

×îºó£¬Í¨¹ýµ÷Óà ±»¹Û²ìÕß µÄaddObservable()»òÕßͨ¹ýSpringµÄXMLÅäÖÃÎļþÍê³É¹Û²ìÕßÏò±»¹Û²ìÕßµÄ×¢Èë¡£´Ëʱ£¬¸Ã¹Û²ìÕß¶ÔÏó¾Í»á±»Ìí¼Ó½ø ±»¹Û²ìÕß µÄListÖС£

µ÷ÓÃÕß²ÅÊÇÕæÕýµÄÊý¾ÝÌṩ·½¡£µ±µ÷ÓÃÕßÐèÒª¹ã²¥×îÐÂÊý¾Ýʱ£¬Ö»Ðèµ÷Óà ±»¹Û²ìÕß µÄnotidyObservers()º¯Êý£¬¸Ãº¯Êý»á±éÀúList¼¯ºÏ£¬²¢ÒÀ´Îµ÷ÓÃÿ¸öObserverµÄupdateº¯Êý£¬´Ó¶øÍê³ÉÊý¾ÝµÄ·¢ËÍ£¬²¢´¥·¢Ã¿¸öObserverÊÕµ½Êý¾ÝºóµÄÒµÎñÂß¼­¡£

Á½ÖÖ×¢²á¹Û²ìÕߵķ½Ê½

½«Observer×¢²á½øObservableÖÐÓÐÈçÏÂÁ½ÖÖ·½Ê½£º

1. ÔËÐÐǰ£¬Í¨¹ýSpring XML

ÔÚϵͳÔËÐÐǰ£¬Èç¹û¹Û²ìÕßÊýÁ¿¿ÉÒÔÈ·¶¨£¬²¢ÔÚÔËÐйý³ÌÖв»»á·¢Éú±ä»¯£¬ÄÇô¾Í¿ÉÒÔÔÚXMLÖÐÍê³ÉList¶ÔÏóµÄ×¢È룬ÕâÖÖ·½Ê½´úÂ뽫»á±È½Ï¼ò½à¡£

1¡¢ÅäÖúÃËùÓÐ ¹Û²ìÕß bean

<!-- ´´½¨observerA -->
<bean name="observerA" class="ObservserA">
</bean>
<!-- ´´½¨observerB-->
<bean name="observerB" class="ObservserB">
</bean>

2¡¢ ÅäÖúà ±»¹Û²ìÕß bean£¬²¢½«ËùÓй۲ìÕßbean×¢Èë¸ø±»¹Û²ìÕßbean

<!-- ´´½¨observable -->
<bean name="observable" class="Observable">
<property name="observerList">
<list>
<ref bean="observerA" />
<ref bean="observerB" />
</list>
</property>
</bean>

2. ÔËÐÐÖУ¬Í¨¹ýaddObserver()º¯Êý

ÔÚSpring³õʼ»¯µÄʱºò£¬Í¨¹ýaddObserver()º¯Êý½«ËùÓÐObserver¶ÔÏó×¢ÈëObservableµÄobserverListÖС£

@Component
public class InitConfiguration implements ApplicationListener<ContextRefreshedEvent>{
@Override
public void onApplicationEvent(ContextRefreshedEvent
arg0) {
if(event.getApplicationContext().getParent() == null){
Observable observable = (Observable)event.getApplicationContext().getBean
("observable");
ObserverA observerA = (ObserverA)event.getApplicationContext().getBean
("observerA");
ObserverB observerB = (ObserverB)event.getApplicationContext().getBean
("observerB");
observable.setObserverList(Arrays.asList(observerA,
observerB));
}
}
}

½¨ÒéʹÓõÚÒ»ÖÖ·½Ê½³õʼ»¯ËùÓеĹ۲ìÕߣ¬´ËÍ⣬±»¹Û²ìÕßÈÔÈ»ÐèÒªÌṩaddObserver()º¯Êý¹©ÏµÍ³ÔÚÔËÐÐÆÚ¼ä¶¯Ì¬µØÌí¼Ó¡¢É¾³ý¹Û²ìÕß¶ÔÏó¡£

JDKÌṩµÄ¹Û²ìÕßģʽ¹¤¾ß°ü

JDKÒѾ­ÌṩÁ˹۲ìÕßģʽµÄ¹¤¾ß°ü£¬°üÀ¨ObservableÀàºÍObserver½Ó¿Ú¡£ÈôҪʵÏÖ¹Û²ìÕßģʽ£¬Ö±½ÓʹÓÃÕâÁ½¸ö¹¤¾ß°ü¼´¿É¡£

. ×°ÊÎģʽ

ºÎʱʹÓÃ

ÐèÒªÔöǿһ¸ö¶ÔÏóÖÐijЩº¯ÊýµÄ¹¦ÄÜ¡£

ÐèÒª¶¯Ì¬µØ¸øÒ»¸ö¶ÔÏóÔö¼Ó¹¦ÄÜ£¬ÕâЩ¹¦ÄÜ¿ÉÒÔÔÙ¶¯Ì¬µØ³·Ïú¡£

ÐèÒªÔö¼Ó ÓÉһЩ»ù±¾¹¦ÄÜÅÅÁÐ×éºÏ ¶ø²úÉúµÄ´óÁ¿¹¦ÄÜ£¬´Ó¶øÊ¹¼Ì³ÐÌåϵ´ó±¬Õ¨¡£

ÀàͼÃèÊö

ÔÚ×°ÊÎģʽÖеĸ÷¸ö½ÇÉ«ÓУº

³éÏó¹¹¼þ£¨Component£©½ÇÉ«£º¸ø³öÒ»¸ö³éÏó½Ó¿Ú£¬ÒԹ淶׼±¸½ÓÊÕ¸½¼ÓÔðÈεĶÔÏó¡£

¾ßÌå¹¹¼þ£¨Concrete Component£©½ÇÉ«£º¶¨ÒåÒ»¸ö½«Òª½ÓÊÕ¸½¼ÓÔðÈεÄÀà¡£

×°ÊΣ¨Decorator£©½ÇÉ«£º³ÖÓÐÒ»¸ö¹¹¼þ£¨Component£©¶ÔÏóµÄʵÀý£¬²¢¶¨ÒåÒ»¸öÓë³éÏó¹¹¼þ½Ó¿ÚÒ»ÖµĽӿڡ£

¾ßÌå×°ÊΣ¨Concrete Decorator£©½ÇÉ«£º¸ºÔð¸ø¹¹¼þ¶ÔÏó¡±ÌùÉÏ¡±¸½¼ÓµÄÔðÈΡ£

DecoratorÖаüº¬ComponentµÄ³ÉÔ±±äÁ¿£¬Ã¿¸öConcrete DecoratorʵÏÖÀà¾ùÐèҪʵÏÖoperation()º¯Êý£¬¸Ãº¯Êý´óÖ¹ý³ÌÈçÏ£º

class ConcreteDecorator {
private Component component;
·µ»ØÀàÐÍ operation(){
// Ö´ÐÐÉÏÒ»²ãµÄoperation()£¬²¢»ñÈ¡·µ»Ø½á¹û
·µ»Ø½á¹û = component.operation();
// Äõ½·µ»Ø½á¹ûºó£¬ÔÙ×ö¶îÍâµÄ´¦Àí
´¦Àí·µ»Ø½á¹û
return ·µ»Ø½á¹û;

ʹÓÃ×°ÊÎÀàµÄ¹ý³ÌÈçÏ£º

// ×¼±¸ºÃËùÓÐ×°ÊÎÀà
DecoratorA decoratorA = new DecoratorA();
DecoratorB decoratorB = new DecoratorB();
DecoratorC decoratorC = new DecoratorC();
// ×¼±¸ºÃ ±»×°ÊεÄÀà
Component component = new Component();
// ×é×°×°ÊÎÀà
decoratorC.setComponent(decoratorB);
decoratorB.setComponent(decoratorA);
decoratorA.setComponent(component);
// Ö´ÐÐ
decoratorC.operation();

Ö´Ðйý³ÌÈçÏ£º

Óŵã

1¡¢DecoratorģʽÓë¼Ì³Ð¹ØÏµµÄÄ¿µÄ¶¼ÊÇÒªÀ©Õ¹¶ÔÏóµÄ¹¦ÄÜ£¬µ«ÊÇDecorator¿ÉÒÔÌṩ±È¼Ì³Ð¸ü¶àµÄÁé»îÐÔ¡£¼Ì³Ðͨ¹ý¸²¸ÇµÄ·½Ê½ÖØÐ´ÐèÒªÀ©Õ¹µÄº¯Êý£¬µ±È»Ò²¿ÉÒÔͨ¹ýsuper.xxx()»ñȡԭ±¾µÄ¹¦ÄÜ£¬È»ºóÔڸù¦ÄÜ»ù´¡ÉÏÀ©Õ¹Ð¹¦ÄÜ£¬µ«ËüÖ»ÄÜÔö¼ÓijһÏÄÜ£»Èç¹ûҪͨ¹ý¼Ì³ÐʵÏÖÔö¼Ó¶àÖÖ¹¦ÄÜ£¬ÄÇôÐèÒª¶à²ã¼Ì³Ð¶à¸öÀàÀ´ÊµÏÖ£»¶øDecoratorģʽ¿ÉÒÔÔÚÔ­Óй¦ÄܵĻù´¡ÉÏͨ¹ý×éºÏÀ´Ôö¼Óй¦ÄÜ£¬ÕâЩй¦ÄÜÒѾ­±»·â×°³ÉÒ»¸ö¸ö¶ÀÁ¢µÄ×°ÊÎÀ࣬ÔÚÔËÐÐÆÚ¼äͨ¹ý´î»ýľµÄ·½Ê½Ñ¡Ôñ×°ÊÎÀàÆ´´Õ¼´¿É¡£

2¡¢Í¨¹ýʹÓò»Í¬µÄ¾ßÌå×°ÊÎÀàÒÔ¼°ÕâЩװÊÎÀàµÄÅÅÁÐ×éºÏ£¬Éè¼ÆÊ¦¿ÉÒÔ´´Ôì³öºÜ¶à²»Í¬ÐÐΪµÄ×éºÏ¡£

ȱµã

1¡¢ÕâÖֱȼ̳иü¼ÓÁé»î»ú¶¯µÄÌØÐÔ£¬Ò²Í¬Ê±Òâζןü¼Ó¶àµÄ¸´ÔÓÐÔ¡£

2¡¢×°ÊÎģʽ»áµ¼ÖÂÉè¼ÆÖгöÏÖÐí¶àСÀ࣬Èç¹û¹ý¶ÈʹÓ㬻áʹ³ÌÐò±äµÃºÜ¸´ÔÓ¡£

3¡¢×°ÊÎģʽÊÇÕë¶Ô³éÏó×é¼þ£¨Component£©ÀàÐͱà³Ì¡£µ«ÊÇ£¬Èç¹ûÄãÒªÕë¶Ô¾ßÌå×é¼þ±à³Ìʱ£¬¾ÍÓ¦¸ÃÖØÐÂ˼¿¼ÄãµÄÓ¦Óüܹ¹£¬ÒÔ¼°×°ÊÎÕßÊÇ·ñºÏÊÊ¡£µ±È»Ò²¿ÉÒԸıäComponent½Ó¿Ú£¬Ôö¼ÓÐµĹ«¿ªµÄÐÐΪ£¬ÊµÏÖ¡°°ë͸Ã÷¡±µÄ×°ÊÎÕßģʽ¡£ÔÚʵ¼ÊÏîÄ¿ÖÐÒª×ö³ö×î¼ÑÑ¡Ôñ¡£

Éè¼ÆÔ­Ôò

¶àÓÃ×éºÏ£¬ÉÙÓü̳С£

ÀûÓü̳ÐÉè¼Æ×ÓÀàµÄÐÐΪ£¬ÊÇÔÚ±àÒëʱ¾²Ì¬¾ö¶¨µÄ£¬¶øÇÒËùÓеÄ×ÓÀà¶¼»á¼Ì³Ðµ½ÏàͬµÄÐÐΪ¡£È»¶ø£¬Èç¹ûÄܹ»ÀûÓÃ×éºÏµÄ×ö·¨À©Õ¹¶ÔÏóµÄÐÐΪ£¬¾Í¿ÉÒÔÔÚÔËÐÐʱ¶¯Ì¬µØ½øÐÐÀ©Õ¹¡£

. µ¥Àýģʽ

JavaÖе¥Àý(Singleton)ģʽÊÇÒ»Öֹ㷺ʹÓõÄÉè¼ÆÄ£Ê½¡£µ¥ÀýģʽµÄÖ÷Òª×÷ÓÃÊDZ£Ö¤ÔÚJava³ÌÐòÖУ¬Ä³¸öÀàÖ»ÓÐÒ»¸öʵÀý´æÔÚ¡£Ò»Ð©¹ÜÀíÆ÷ºÍ¿ØÖÆÆ÷³£±»Éè¼Æ³Éµ¥Àýģʽ¡£

µ¥ÀýģʽÓкܶàºÃ´¦£¬ËüÄܹ»±ÜÃâʵÀý¶ÔÏóµÄÖØ¸´´´½¨£¬²»½ö¿ÉÒÔ¼õÉÙÿ´Î´´½¨¶ÔÏóµÄʱ¼ä¿ªÏú£¬»¹¿ÉÒÔ½ÚÔ¼ÄÚ´æ¿Õ¼ä£»Äܹ»±ÜÃâÓÉÓÚ²Ù×÷¶à¸öʵÀýµ¼ÖµÄÂß¼­´íÎó¡£Èç¹ûÒ»¸ö¶ÔÏóÓпÉÄܹᴩÕû¸öÓ¦ÓóÌÐò£¬¶øÇÒÆðµ½ÁËÈ«¾Öͳһ¹ÜÀí¿ØÖÆµÄ×÷Óã¬ÄÇôµ¥ÀýģʽҲÐíÊÇÒ»¸öÖµµÃ¿¼ÂǵÄÑ¡Ôñ¡£

µ¥ÀýģʽÓкܶàÖÖд·¨£¬´ó²¿·Öд·¨¶¼»ò¶à»òÉÙÓÐһЩ²»×ã¡£ÏÂÃæ½«·Ö±ð¶ÔÕ⼸ÖÖд·¨½øÐнéÉÜ¡£

. ¶öººÄ£Ê½

public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton newInstance(){
return instance;
}
}

ÀàµÄ¹¹Ô캯Êý¶¨ÒåΪprivate£¬±£Ö¤ÆäËûÀ಻ÄÜʵÀý»¯´ËÀࣻ

È»ºóÌṩÁËÒ»¸ö¾²Ì¬ÊµÀý²¢·µ»Ø¸øµ÷ÓÃÕߣ»

¶öººÄ£Ê½ÔÚÀà¼ÓÔØµÄʱºò¾Í¶ÔʵÀý½øÐд´½¨£¬ÊµÀýÔÚÕû¸ö³ÌÐòÖÜÆÚ¶¼´æÔÚ

Óŵ㣺ֻÔÚÀà¼ÓÔØµÄʱºò´´½¨Ò»´ÎʵÀý£¬²»»á´æÔÚ¶à¸öÏ̴߳´½¨¶à¸öʵÀýµÄÇé¿ö£¬±ÜÃâÁ˶àÏß³Ìͬ²½µÄÎÊÌâ¡£

ȱµã£º¼´Ê¹Õâ¸öµ¥ÀýûÓÐÓõ½Ò²»á±»´´½¨£¬¶øÇÒÔÚÀà¼ÓÔØÖ®ºó¾Í±»´´½¨£¬ÄÚ´æ¾Í±»ÀË·ÑÁË¡£

ÊÊÓó¡¾°£ºÕâÖÖʵÏÖ·½Ê½Êʺϵ¥ÀýÕ¼ÓÃÄÚ´æ±È½ÏС£¬ÔÚ³õʼ»¯Ê±¾Í»á±»Óõ½µÄÇé¿ö¡£µ«ÊÇ£¬Èç¹ûµ¥ÀýÕ¼ÓõÄÄÚ´æ±È½Ï´ó£¬»òµ¥ÀýÖ»ÊÇÔÚij¸öÌØ¶¨³¡¾°Ï²ŻáÓõ½£¬Ê¹ÓööººÄ£Ê½¾Í²»ºÏÊÊÁË£¬Õâʱºò¾ÍÐèÒªÓõ½ÀÁººÄ£Ê½½øÐÐÑÓ³Ù¼ÓÔØ¡£

. ÀÁººÄ£Ê½(´æÔÚḬ̈߳²È«ÐÔÎÊÌâ)

public class Singleton{
private static Singleton instance = null;
private Singleton(){}
public static Singleton newInstance(){
if(null == instance){
instance = new Singleton();
}
return instance;
}
}

ÀÁººÄ£Ê½Öе¥ÀýÊÇÔÚÐèÒªµÄʱºò²ÅÈ¥´´½¨µÄ£¬Èç¹ûµ¥ÀýÒѾ­´´½¨£¬Ôٴε÷ÓûñÈ¡½Ó¿Ú½«²»»áÖØÐ´´½¨ÐµĶÔÏ󣬶øÊÇÖ±½Ó·µ»ØÖ®Ç°´´½¨µÄ¶ÔÏó¡£

Èç¹ûij¸öµ¥ÀýʹÓõĴÎÊýÉÙ£¬²¢ÇÒ´´½¨µ¥ÀýÏûºÄµÄ×ÊÔ´½Ï¶à£¬ÄÇô¾ÍÐèҪʵÏÖµ¥ÀýµÄ°´Ðè´´½¨£¬Õâ¸öʱºòʹÓÃÀÁººÄ£Ê½¾ÍÊÇÒ»¸ö²»´íµÄÑ¡Ôñ¡£

µ«ÊÇÕâÀïµÄÀÁººÄ£Ê½²¢Ã»Óп¼ÂÇḬ̈߳²È«ÎÊÌ⣬ÔÚ¶à¸öÏ߳̿ÉÄܻᲢ·¢µ÷ÓÃËüµÄgetInstance()·½·¨£¬µ¼Ö´´½¨¶à¸öʵÀý£¬Òò´ËÐèÒª¼ÓËø½â¾öÏß³Ìͬ²½ÎÊÌ⣬ʵÏÖÈçÏ¡£

. ÀÁººÄ£Ê½(Ḭ̈߳²È«£¬µ«Ð§ÂʵÍ)

public class Singleton{
private static Singleton instance = null;
private Singleton(){}
public static synchronized Singleton newInstance(){
if(null == instance){
instance = new Singleton();
}
return instance;
}
}

¼ÓËøµÄÀÁººÄ£Ê½¿´ÆðÀ´¼´½â¾öÁËÏ̲߳¢·¢ÎÊÌ⣬ÓÖʵÏÖÁËÑÓ³Ù¼ÓÔØ£¬È»¶øËü´æÔÚ×ÅÐÔÄÜÎÊÌ⣬ÒÀÈ»²»¹»ÍêÃÀ¡£synchronizedÐÞÊεÄͬ²½·½·¨±ÈÒ»°ã·½·¨ÒªÂýºÜ¶à£¬Èç¹û¶à´Îµ÷ÓÃgetInstance()£¬ÀÛ»ýµÄÐÔÄÜËðºÄ¾Í±È½Ï´óÁË¡£

. ÀÁººÄ£Ê½(Ḭ̈߳²È«£¬Ð§Âʸß)

public class Singleton {
private static Singleton instance = null;
private Singleton(){}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}

ÕâÖÖ·½Ê½±ÈÉÏÒ»ÖÖ·½Ê½Ö»¶à¼ÓÁËÒ»ÐдúÂ룬ÄǾÍÊÇÔÚsynchronizedÖ®ÉÏÓÖ¼ÓÁËÒ»²ãÅжÏif (instance == null)¡£ÕâÑùµ±µ¥Àý´´½¨Íê±Ïºó£¬²»ÓÃÿ´Î¶¼½øÈëͬ²½´úÂë¿é£¬´Ó¶øÄÜÌáÉýЧÂÊ¡£µ±È»£¬³ýÁ˳õʼ»¯µ¥Àý¶ÔÏóµÄÏß³ÌThreadAÍ⣬¿ÉÄÜ»¹´æÔÚÉÙÊýỊ̈߳¬ÔÚThreadA´´½¨Íêµ¥Àýºó£¬¸ÕÊÍ·ÅËøµÄʱºò½øÈëͬ²½´úÂë¿é£¬µ«´ËʱÓеڶþµÀif (instance == null)Åжϣ¬Òò´ËÒ²¾Í±ÜÃâÁË´´½¨¶à¸ö¶ÔÏó¡£¶øÇÒ½øÈëͬ²½´úÂë¿éµÄÏß³ÌÏà¶Ô½ÏÉÙ¡£

. ¾²Ì¬ÄÚ²¿Àà(ÀÁºº+ÎÞËø)

public class Singleton{
private static class SingletonHolder{
public static Singleton instance = new Singleton();
}
private Singleton(){}
public static Singleton newInstance(){
return SingletonHolder.instance;
}
}

ÕâÖÖ·½Ê½Í¬ÑùÀûÓÃÁËÀà¼ÓÔØ»úÖÆÀ´±£Ö¤Ö»´´½¨Ò»¸öinstanceʵÀý¡£ËüÓë¶öººÄ£Ê½Ò»Ñù£¬Ò²ÊÇÀûÓÃÁËÀà¼ÓÔØ»úÖÆ£¬Òò´Ë²»´æÔÚ¶àÏ̲߳¢·¢µÄÎÊÌâ¡£²»Ò»ÑùµÄÊÇ£¬ËüÊÇÔÚÄÚ²¿ÀàÀïÃæÈ¥´´½¨¶ÔÏóʵÀý¡£ÕâÑùµÄ»°£¬Ö»ÒªÓ¦ÓÃÖв»Ê¹ÓÃÄÚ²¿À࣬JVM¾Í²»»áÈ¥¼ÓÔØÕâ¸öµ¥ÀýÀ࣬Ҳ¾Í²»»á´´½¨µ¥Àý¶ÔÏ󣬴ӶøÊµÏÖÀÁººÊ½µÄÑÓ³Ù¼ÓÔØ¡£Ò²¾ÍÊÇ˵ÕâÖÖ·½Ê½¿ÉÒÔͬʱ±£Ö¤ÑÓ³Ù¼ÓÔØºÍḬ̈߳²È«¡£

. ö¾Ù

public enum Singleton{
instance;
public void whateverMethod(){}
}

ÉÏÃæÌáµ½µÄËÄÖÖʵÏÖµ¥ÀýµÄ·½Ê½¶¼Óй²Í¬µÄȱµã£º

1¡¢ÐèÒª¶îÍâµÄ¹¤×÷À´ÊµÏÖÐòÁл¯£¬·ñÔòÿ´Î·´ÐòÁл¯Ò»¸öÐòÁл¯µÄ¶ÔÏóʱ¶¼»á´´½¨Ò»¸öеÄʵÀý¡£

2¡¢¿ÉÒÔʹÓ÷´ÉäÇ¿Ðе÷ÓÃ˽Óй¹ÔìÆ÷£¨Èç¹ûÒª±ÜÃâÕâÖÖÇé¿ö£¬¿ÉÒÔÐ޸Ĺ¹ÔìÆ÷£¬ÈÃËüÔÚ´´½¨µÚ¶þ¸öʵÀýµÄʱºòÅ×Òì³££©¡£

¶øÃ¶¾ÙÀàºÜºÃµÄ½â¾öÁËÕâÁ½¸öÎÊÌ⣬ʹÓÃö¾Ù³ýÁËḬ̈߳²È«ºÍ·ÀÖ¹·´Éäµ÷Óù¹ÔìÆ÷Ö®Í⣬»¹ÌṩÁË×Ô¶¯ÐòÁл¯»úÖÆ£¬·ÀÖ¹·´ÐòÁл¯µÄʱºò´´½¨ÐµĶÔÏó¡£Òò´Ë£¬¡¶Effective Java¡·×÷ÕßÍÆ¼öʹÓõķ½·¨¡£²»¹ý£¬ÔÚʵ¼Ê¹¤×÷ÖУ¬ºÜÉÙ¿´¼ûÓÐÈËÕâôд¡£

. Ä£°å·½·¨Ä£Ê½

¶¨Òå

ÔÚ¸¸ÀàÖж¨ÒåËã·¨µÄÁ÷³Ì£¬¶øËã·¨µÄijЩÎÞ·¨È·¶¨µÄϸ½Ú£¬Í¨¹ý³éÏóº¯ÊýµÄÐÎʽ£¬ÔÚ×ÓÀàÖÐȥʵÏÖ¡£

Ò²¿ÉÒÔÀí½âΪ£¬Ò»Ì×Ëã·¨µÄijЩ²½Öè¿ÉÄÜËæ×ÅÒµÎñµÄ·¢Õ¹¶ø¸Ä±ä£¬ÄÇôÎÒÃÇ¿ÉÒÔ½«È·¶¨µÄ²½ÖèÔÚ¸¸ÀàÖÐʵÏÖ£¬¶ø¿É±äµÄ²½Öè×÷Ϊ³éÏóº¯ÊýÈÃÆäÔÚ×ÓÀàÖÐʵÏÖ¡£

ÔÚÄ£°å·½·¨Ä£Ê½ÖУ¬¸¸ÀàÊÇÒ»¸ö³éÏóÀ࣬Ëã·¨µÄÿһ²½¶¼±»·â×°³ÉÒ»¸öº¯Êý£¬templateMethodº¯Êý½«ËùÓÐËã·¨²½Öè´®ÁªÆðÀ´¡£

¶ÔÓÚ²»±äµÄ²½Ö裬ÓÃprivateÐÞÊΣ¬·ÀÖ¹×ÓÀàÖØÐ´£»

¶ÔÓڿɱäµÄ²½Ö裬ÓÃabstract protectedÐÞÊΣ¬±ØÐëÒªÇó×ÓÀàÖØÐ´£»

×ÓÀàÖØÐ´ÍêËùÓгéÏóº¯Êýºó£¬µ÷ÓÃtemplateMethod¼´¿ÉÖ´ÐÐËã·¨¡£

. Íâ¹Ûģʽ

Íâ¹ÛģʽÕâÖÖ˼ÏëÔÚÏîÄ¿ÖÐÆÕ±é´æÔÚ£¬Ò²¼«ÆäÈÝÒ×Àí½â£¬´ó¼ÒÒ»¶¨Óùý£¬Ö»ÊÇûÓÐÉÏÉýµ½ÀíÂ۵IJãÃæ¡£ÕâÀï¶ÔÕâÖÖ˼Ïë½øÐнéÉÜ¡£

Íâ¹ÛģʽËûÆÁ±ÎÁËϵͳ¹¦ÄÜʵÏֵĸ´ÔÓÐÔ£¬Ïò¿Í»§¶ËÌṩһÌ×¼«Æä¼òµ¥µÄ½Ó¿Ú¡£¿Í»§¶ËÖ»ÐèÒªÖªµÀ½Ó¿ÚÌṩʲô¹¦ÄÜ£¬ÈçºÎµ÷ÓþÍÐÐÁË£¬²»ÐèÒª¹ÜÕâЩ½Ó¿Ú±³ºóÊÇÈçºÎʵÏֵġ£´Ó¶øÊ¹µÃ¿Í»§¶ËºÍϵͳ֮¼äµÄñîºÏ¶È´ó´ó½µµÍ£¬¿Í»§¶ËÖ»Ðè¸úÒ»Ì×¼òµ¥µÄFacade½Ó¿Ú´ò½»µÀ¼´¿É¡£

. ÊÊÅäÆ÷ģʽ

¶¨Òå

×÷Ϊһ¸ö»ù½ð½»Òׯ½Ì¨£¬ÐèÒªÌṩһÌ׽ӿڹ淶£¬¹©¸÷¸ö»ù½ð¹«Ë¾½ÓÈ롣Ȼ¶ø£¬¸÷¸ö»ù½ð¹«Ë¾µÄ½Ó¿Ú¸÷²»Ïàͬ£¬Ã»Óа취ֱ½ÓºÍƽ̨½Ó¿Ú¶Ô½Ó¡£´Ëʱ£¬¸÷¸ö»ù½ð¹«Ë¾ÐèÒª×ÔÐÐʵÏÖÒ»¸öÊÊÅäÆ÷£¬ÊÊÅäÆ÷Íê³É²»Í¬½Ó¿ÚµÄת»»¹¤×÷£¬Ê¹µÃ»ù½ð¹«Ë¾µÄ½Ó¿ÚºÍƽ̨ÌṩµÄ½Ó¿Ú¶Ô½ÓÉÏ¡£

. ÈýÖÖÊÊÅäÆ÷

ÊÊÅäÆ÷ģʽÓÐÈýÖÖʵÏÖ·½Ê½£¬ÏÂÃæ¶¼ÒÔ»ù½ð½»Òׯ½Ì¨µÄÀý×ÓÀ´½âÊÍ¡£

»ù½ð¹«Ë¾µÄ½»Ò×½Ó¿Ú£º

/**
* »ù½ð¹«Ë¾µÄ½»Ò×½Ó¿Ú
*/
class FundCompanyTrade{
/**
* ÂòÈ뺯Êý
*/
public void mairu() {
// ¡­¡­
}
/**
* Âô³öº¯Êý
*/
public void maichu() {
// ¡­¡­
}
}

»ù½ð½»Òׯ½Ì¨µÄ½»Ò×½Ó¿Ú

/**
* »ù½ð½»Òׯ½Ì¨µÄ½»Ò×½Ó¿Ú
*/
interface FundPlatformTrade {
// ÂòÈë½Ó¿Ú
void buy();
// Âô³ö½Ó¿Ú
void sell();
}

»ù½ð½»Òׯ½Ì¨¾ùͨ¹ýÈçÏ´úÂëµ÷Óø÷¸ö»ù½ð¹«Ë¾µÄ½»Ò×½Ó¿Ú£º

class Client {
@Autowired
private FundPlatformTrade fundPlatformTrade;
/**
* ÂòÈë»ù½ð
*/
public void buy() {
fundPlatformTrade.buy();
}
/**
* Âô³ö»ù½ð
*/
public void sell() {
fundPlatformTrade.sell();
}
}

·½Ê½1£ºÀàÊÊÅäÆ÷

ͨ¹ý¼Ì³ÐÀ´ÊµÏÖ½Ó¿ÚµÄת»»¡£

»ù½ð½»Ò×ÊÊÅäÆ÷£º

class Adapter extends FundCompanyTrade implements FundPlatformTrade {
void buy() {
mairu();
}
void sell(){
maichu();
}
}

ÊÊÅäÆ÷Adapter¼Ì³ÐÁËFundCompanyTrade£¬Òò´ËÓµÓÐÁËFundCompanyTradeÂòÈëºÍÂô³öµÄÄÜÁ¦£»ÊÊÅäÆ÷AdapterÓÖʵÏÖÁËFundPlatformTrade£¬Òò´ËÐèҪʵÏÖÆäÖеÄÂòÈëºÍÂô³ö½Ó¿Ú£¬Õâ¸ö¹ý³Ì±ãÍê³ÉÁË»ù½ð¹«Ë¾½»Ò×½Ó¿ÚÏò»ù½ðƽ̨½»Ò×½Ó¿ÚµÄת»»¡£

ʹÓÃʱ£¬Ö»Ð轫Adapterͨ¹ýSpring×¢Èë¸øClientÀàµÄfundPlatformTrade³ÉÔ±±äÁ¿¼´¿É£º

<!-- ÉùÃ÷Adapter¶ÔÏó -->
<bean name="adapter" class="Adapter">
</bean>
<!-- ½«adapter×¢Èë¸øClient -->
<bean class="Client">
<property name="fundPlatformTrade" ref="adapter" />
</bean>

·½Ê½2£º¶ÔÏóÊÊÅäÆ÷

ͨ¹ý×éºÏÀ´ÊµÏÖ½Ó¿ÚµÄת»»¡£

»ù½ð½»Ò×ÊÊÅäÆ÷£º

class Adapter implements FundPlatformTrade {
@Autowired
private FundCompanyTrade fundCompanyTrade;
void buy() {
fundCompanyTrade.mairu();
}
void sell(){
fundCompanyTrade.maichu();
}
}

ÕâÖÖ·½Ê½ÖУ¬ÊÊÅäÆ÷Adapter²¢Î´¼Ì³ÐFundCompanyTrade£¬¶øÊǽ«¸Ã¶ÔÏó×÷Ϊ³ÉÔ±±äÁ¿×¢Èë½øÀ´£¬Ò»Ñù¿ÉÒԴﵽͬÑùµÄЧ¹û¡£

·½Ê½3£º½Ó¿ÚÊÊÅäÆ÷

µ±´æÔÚÕâÑùÒ»¸ö½Ó¿Ú£¬ÆäÖж¨ÒåÁËN¶àµÄ·½·¨£¬¶øÎÒÃÇÏÖÔÚÈ´Ö»ÏëʹÓÃÆäÖеÄÒ»¸öµ½¼¸¸ö·½·¨£¬Èç¹ûÎÒÃÇÖ±½ÓʵÏÖ½Ó¿Ú£¬ÄÇôÎÒÃÇÒª¶ÔËùÓеķ½·¨½øÐÐʵÏÖ£¬ÄÄÅÂÎÒÃǽö½öÊǶԲ»ÐèÒªµÄ·½·¨½øÐÐÖÿգ¨Ö»Ð´Ò»¶Ô´óÀ¨ºÅ£¬²»×ö¾ßÌå·½·¨ÊµÏÖ£©Ò²»áµ¼ÖÂÕâ¸öÀà±äµÃÓ·Ö×£¬µ÷ÓÃÒ²²»·½±ã£¬ÕâʱÎÒÃÇ¿ÉÒÔʹÓÃÒ»¸ö³éÏóÀà×÷ΪÖмä¼þ£¬¼´ÊÊÅäÆ÷£¬ÓÃÕâ¸ö³éÏóÀàʵÏÖ½Ó¿Ú£¬¶øÔÚ³éÏóÀàÖÐËùÓеķ½·¨¶¼½øÐÐÖÿգ¬ÄÇôÎÒÃÇÔÚ´´½¨³éÏóÀàµÄ¼Ì³ÐÀ࣬¶øÇÒÖØÐ´ÎÒÃÇÐèҪʹÓõÄÄǼ¸¸ö·½·¨¼´¿É¡£

Ä¿±ê½Ó¿Ú£ºA

public interface A {
void a();
void b();
void c();
void d();
void e();
void f();
}

ÊÊÅäÆ÷£ºAdapter

ʵÏÖËùÓк¯Êý£¬½«ËùÓк¯ÊýÏÈÖÿա£

public abstract class Adapter implements A {
public void a(){
throw new UnsupportedOperationException("¶ÔÏó²»Ö§³ÖÕâ¸ö¹¦ÄÜ");
}
public void b(){
throw new UnsupportedOperationException("¶ÔÏó²»Ö§³ÖÕâ¸ö¹¦ÄÜ");
}
public void c(){
throw new UnsupportedOperationException("¶ÔÏó²»Ö§³ÖÕâ¸ö¹¦ÄÜ");
}
public void d(){
throw new UnsupportedOperationException("¶ÔÏó²»Ö§³ÖÕâ¸ö¹¦ÄÜ");
}
public void e(){
throw new UnsupportedOperationException("¶ÔÏó²»Ö§³ÖÕâ¸ö¹¦ÄÜ");
}
public void f(){
throw new UnsupportedOperationException("¶ÔÏó²»Ö§³ÖÕâ¸ö¹¦ÄÜ");
}
}

ʵÏÖÀࣺAshili

¼Ì³ÐÊÊÅäÆ÷À࣬ѡÔñÐÔµØÖØÐ´ÏàÓ¦º¯Êý¡£

public class Ashili extends Adapter {
public void a(){
System.out.println("ʵÏÖA·½·¨±»µ÷ÓÃ");
}
public void d(){
System.out.println("ʵÏÖd·½·¨±»µ÷ÓÃ");
}
}

. µü´úÆ÷ģʽ

¶¨Òå

µü´úÆ÷ģʽÓÃÓÚÔÚÎÞÐèÁ˽âÈÝÆ÷ÄÚ²¿Ï¸½ÚµÄÇé¿öÏ£¬ÊµÏÖÈÝÆ÷µÄµü´ú¡£

ÈÝÆ÷ÓÃÓÚ´æ´¢Êý¾Ý£¬¶øÈÝÆ÷µÄ´æ´¢½á¹¹ÖÖÀà·±¶à¡£ÔÚ²»Ê¹ÓÃÊÊÅäÆ÷ģʽµÄÇé¿öÏ£¬Èç¹ûÒªµü´úÈÝÆ÷ÖеÄÔªËØ£¬¾ÍÐèÒª³ä·ÖÀí½âÈÝÆ÷µÄ´æ´¢½á¹¹¡£´æ´¢½á¹¹²»Í¬£¬µ¼ÖÂÁ˲»Í¬ÈÝÆ÷µÄµü´ú·½Ê½¶¼²»Ò»Ñù¡£ÕâÎÞÒÉÔö¼ÓÁËÎÒÃÇʹÓÃÈÝÆ÷µÄ³É±¾¡£

¶øµü´úÆ÷ģʽÌá³öÁËÒ»ÖÖµü´úÈÝÆ÷ÔªËØµÄÐÂ˼·£¬µü´úÆ÷¹æ¶¨ÁËÒ»×éµü´úÈÝÆ÷µÄ½Ó¿Ú£¬×÷ΪÈÝÆ÷ʹÓÃÕߣ¬Ö»Ðè»áÓÃÕâÌ×µü´úÆ÷¼´¿É¡£ÈÝÆ÷±¾ÉíÐèҪʵÏÖÕâÌ×µü´úÆ÷½Ó¿Ú£¬²¢ÊµÏÖÆäÖеĵü´úº¯Êý¡£Ò²¾ÍÊÇÈÝÆ÷Ìṩ·½ÔÚÌṩÈÝÆ÷µÄͬʱ£¬»¹ÐèÒªÌṩµü´úÆ÷µÄʵÏÖ¡£ÒòΪÈÝÆ÷±¾ÉíÊÇÁ˽â×Ô¼ºµÄ´æ´¢½á¹¹µÄ£¬ÓÉËüÀ´ÊµÏÖµü´úº¯Êý·Ç³£ºÏÊÊ¡£¶øÎÒÃÇ×÷ΪÈÝÆ÷µÄʹÓÃÕߣ¬Ö»ÐèÖªµÀÔõôÓõü´úÆ÷¼´¿É£¬ÎÞÐèÁ˽âÈÝÆ÷ÄÚ²¿µÄ´æ´¢½á¹¹¡£

ÀàͼÃèÊö

ÔÚµü´úÆ÷ģʽÖУ¬Ò»¹²ÓÐÁ½ÖÖ½ÇÉ«£ºµü´úÆ÷ ºÍ ÈÝÆ÷

µü´úÆ÷ Iterator£º·â×°Á˵ü´úÈÝÆ÷µÄ½Ó¿Ú

ÈÝÆ÷ Container£º´æ´¢ÔªËصĶ«Î÷

ÈÝÆ÷ÈôÒª¾ß±¸µü´úµÄÄÜÁ¦£¬¾Í±ØÐëÓµÓÐgetIterator()º¯Êý£¬¸Ãº¯Êý½«»á·µ»ØÒ»¸öµü´úÆ÷¶ÔÏó

ÿ¸öÈÝÆ÷¶¼ÓÐÊôÓÚ×Ô¼ºµÄµü´úÆ÷ÄÚ²¿À࣬¸ÃÄÚ²¿ÀàʵÏÖÁËIterator½Ó¿Ú£¬²¢ÊµÏÖÁËÆäÖÐÓÃÓÚµü´úµÄÁ½¸öº¯ÊýhasNext()ºÍnext()

boolean hasNext()£ºÓÃÓÚÅжϵ±Ç°ÈÝÆ÷ÊÇ·ñ»¹ÓÐÉÐδµü´úÍêµÄÔªËØ

Object next()£ºÓÃÓÚ»ñÈ¡ÏÂÒ»¸öÔªËØ

´úÂëʵÏÖ

µü´úÆ÷½Ó¿Ú£º

public interface Iterator {
public boolean hasNext();
public Object next();
}

ÈÝÆ÷½Ó¿Ú£º

public interface Iterator {
public boolean hasNext();
public Object next();
}

¾ßÌåµÄÈÝÆ÷£¨±ØÐëʵÏÖContainer½Ó¿Ú£©£º

public class NameRepository implements Container {
public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};
@Override
public Iterator getIterator() {
return new NameIterator();
}
private class NameIterator implements Iterator {
int index;
@Override
public boolean hasNext() {
if(index < names.length){
return true;
}
return false;
}
@Override
public Object next() {
if(this.hasNext()){
return names[index++];
}
return null;
}
}
}

¾ßÌåµÄÈÝÆ÷ʵÏÖÁËContainer½Ó¿Ú£¬²¢ÊµÏÖÁËÆäÖеÄgetIterator()º¯Êý£¬¸Ãº¯ÊýÓÃÓÚ·µ»Ø¸ÃÈÝÆ÷µÄµü´úÆ÷¶ÔÏó¡£

ÈÝÆ÷ÄÚ²¿ÐèҪʵÏÖ×Ô¼ºµÄµü´úÆ÷ÄÚ²¿À࣬¸ÃÄÚ²¿ÀàʵÏÖIterator½Ó¿Ú£¬²¢ÊµÏÖÁËÆäÖеÄhasNext()ºÍnext()º¯Êý¡£

µ±ÈÝÆ÷ºÍÈÝÆ÷µÄµü´úÆ÷´´½¨Íê±Ïºó£¬½ÓÏÂÀ´¾ÍÂÖµ½Óû§Ê¹ÓÃÁË£¬Ê¹Óþͷdz£¼òµ¥ÁË£º

public class IteratorPatternDemo {
public static void main(String[] args) {
NameRepository namesRepository = new NameRepository();
for(Iterator iter = namesRepository.getIterator(); iter.hasNext();){
String name = (String)iter.next();
System.out.println("Name : " + name);
}
}
}

¶ÔÓÚʹÓÃÕß¶øÑÔ£¬Ö»ÒªÖªµÀIterator½Ó¿Ú£¬¾ÍÄܹ»µü´úËùÓв»Í¬ÖÖÀàµÄÈÝÆ÷ÁË¡£

. ×éºÏģʽ

¶¨Òå

×éºÏģʽ¶¨ÒåÁËÊ÷ÐνṹµÄÎïÀí´æ´¢·½Ê½¡£

ÏÖʵÊÀ½çÖÐÊ÷ÐνṹµÄ¶«Î÷£¬ÔÚ´úÂëʵÏÖÖУ¬¶¼¿ÉÒÔÓÃ×éºÏģʽÀ´±íʾ¡£

±ÈÈ磺¶à¼¶²Ëµ¥¡¢¹«Ë¾µÄ×éÖ¯½á¹¹µÈµÈ¡£

ÏÂÃæ¾ÍÒԶ༶²Ëµ¥ÎªÀý£¬½éÉÜ×éºÏģʽ¡£

Àý×Ó

¼ÙÉèÎÒÃÇҪʵÏÖÒ»¸ö¶à¼¶²Ëµ¥£¬²¢ÊµÏֶ༶²Ëµ¥µÄÔöɾ¸Ä²é²Ù×÷¡£²Ëµ¥ÈçÏ£º

Ò»¼¶²Ëµ¥A
  ¶þ¼¶²Ëµ¥A_1
    Èý¼¶²Ëµ¥A_1_1
    Èý¼¶²Ëµ¥A_1_2
    Èý¼¶²Ëµ¥A_1_3
  ¶þ¼¶²Ëµ¥A_2
Ò»¼¶²Ëµ¥B
  ¶þ¼¶²Ëµ¥B_1
  ¶þ¼¶²Ëµ¥B_2
  ¶þ¼¶²Ëµ¥B_3
  ¶þ¼¶²Ëµ¥B_4
     Èý¼¶²Ëµ¥B_4_1
     Èý¼¶²Ëµ¥B_4_2
     Èý¼¶²Ëµ¥B_4_3
Ò»¼¶²Ëµ¥C
  ¶þ¼¶²Ëµ¥C_1
  ¶þ¼¶²Ëµ¥C_2
  ¶þ¼¶²Ëµ¥C_3

²Ëµ¥µÄÌØµãÈçÏ£º

Éî¶È²»ÏÞ£¬¿ÉÒÔÓÐÎÞÏÞ¼¶²Ëµ¥

ÿ²ã²Ëµ¥ÊýÁ¿²»ÏÞ

ÀàͼÃèÊö

Item±íʾÊ÷ÖеĽڵ㣻

ItemÖаüº¬Á½¸ö³ÉÔ±±äÁ¿£º

parent£ºÖ¸Ïòµ±Ç°½ÚµãµÄ¸¸½Úµã

childList£ºµ±Ç°½ÚµãµÄ×Ó½ÚµãÁбí

ÕâÖÖItemÖÐÓÖ°üº¬ItemµÄ¹ØÏµ¾Í¹¹³ÉÁË×éºÏģʽ¡£

×¢Ò⣺ѭ»·ÒýÓÃ

ÔÚ¹¹½¨Ê÷µÄ¹ý³ÌÖУ¬¿ÉÄÜ»á³öÏÖÑ­»·ÒýÓ㬴ӶøÔÚ±éÀúÊ÷µÄʱºò¿ÉÄܾͻá³öÏÖËÀÑ­»·¡£Òò´Ë£¬ÎÒÃÇÐèÒªÔÚÌí¼Ó½ÚµãµÄʱºò±ÜÃâÑ­»·ÒýÓõijöÏÖ¡£

ÎÒÃÇ¿ÉÒÔÔÚItemÖÐÔÙÌí¼ÓÒ»¸öList³ÉÔ±±äÁ¿£¬ÓÃÓڼǼ¸ù½Úµãµ½µ±Ç°½ÚµãµÄ·¾¶¡£¸Ã·¾¶¿ÉÒÔÓÃÿ¸ö½ÚµãµÄID±íʾ¡£Ò»µ©Ð¼ÓÈëµÄ½ÚµãIDÒѾ­³öÏÖÔÚµ±Ç°Â·¾¶ÖеÄʱºò£¬¾Í˵Ã÷³öÏÖÁËÑ­»·ÒýÓ㬴ËʱӦ¸Ã¸ø³öÌáʾ¡£

. ״̬ģʽ

ʹÓó¡¾°

Èç¹ûÒ»¸öº¯ÊýÖгöÏÖ´óÁ¿µÄ¡¢¸´ÔÓµÄif-elseÅжϣ¬Õâʱºò¾ÍÒª¿¼ÂÇʹÓÃ״̬ģʽÁË¡£

ÒòΪ´óÁ¿µÄif-elseÖÐÍùÍù°üº¬ÁË´óÁ¿µÄÒµÎñÂß¼­£¬ºÜÓпÉÄÜ»áËæ×ÅÒµÎñµÄ·¢Õ¹¶ø±ä»¯¡£Èç¹û½«ÕâЩҵÎñÂß¼­¶¼Ð´ËÀÔÚÒ»¸öÀàÖУ¬ÄÇôµ±ÒµÎñÂß¼­·¢Éú±ä»¯µÄʱºò¾ÍÐèÒªÐÞ¸ÄÕâ¸öÀ࣬´Ó¶øÎ¥·´ÁË¿ª·Å·â±ÕÔ­Ôò¡£¶ø×´Ì¬Ä£Ê½¾ÍÄܺܺõؽâ¾öÕâÒ»ÎÊÌâ¡£

״̬ģʽ½«Ã¿Ò»¸öÅжϷÖÖ§¶¼·â×°³ÉÒ»¸ö¶ÀÁ¢µÄÀ࣬ÿһ¸öÅжϷÖÖ§³ÉΪһÖÖ¡°×´Ì¬¡±£¬Òò´Ëÿһ¸ö¶ÀÁ¢µÄÀà¾Í³ÉΪһ¸ö¡°×´Ì¬Àࡱ¡£²¢ÇÒÓÉÒ»¸öÈ«¾Ö״̬¹ÜÀíÕßContextÀ´Î¬»¤µ±Ç°µÄ״̬¡£

ÀàͼÃèÊö

ÔÚ״̬ģʽÖУ¬Ã¿Ò»¸öÅжϷÖÖ§±»³ÉΪһÖÖ״̬£¬Ã¿Ò»ÖÖ״̬£¬¶¼»á±»·â×°³ÉÒ»¸öµ¥¶ÀµÄ״̬Àࣻ

ËùÓеÄ״̬Àà¶¼ÓÐÒ»¸ö¹²Í¬µÄ½Ó¿Ú¡ª¡ªState

State½Ó¿ÚÖÐÓÐÒ»¸ödoActionº¯Êý£¬Ã¿¸ö״̬ÀàµÄ״̬´¦ÀíÂß¼­¾ùÔڸú¯ÊýÖÐÍê³É£»±ØÐ뽫Context¶ÔÏó×÷ΪdoActionº¯ÊýµÄ²ÎÊý´«Èë¡£¸Ãº¯ÊýµÄ½á¹¹ÈçÏ£º

class StateA implements State{
public void doAction(Context context){
if (Âú×ãÌõ¼þ) {
// Ö´ÐÐÏàÓ¦µÄÒµÎñÂß¼­
}
else {
// ÉèÖÃÏÂÒ»Ìø×´Ì¬
context.setState(new StateB());
// Ö´ÐÐÏÂÒ»Ìø×´Ì¬
context.doCurState();
}
}
}

ÿ¸ö״̬ÀàµÄdoActionº¯ÊýÖж¼ÓÐÇÒ½öÓÐÒ»¶Ôif-else£¬ifÖÐÌîдÂú×ãÌõ¼þʱµÄÒµÎñÂß¼­£¬¶øelseÖÐÌîд²»Âú×ãÌõ¼þʱµÄÒµÎñÂß¼­¡£

elseÖеĴúÂë¶¼Ò»Ñù£¬ÓÐÇÒ½öÓÐÕâÁ½²½£º

Ê×ÏȽ«contextµÄstateÉèΪÏÂÒ»¸ö״̬¶ÔÏó£»

È»ºóµ÷ÓÃcontextµÄdoCurState()Ö´ÐУ»

ContextÀàÆäʵ¾ÍÊÇÔ­±¾°üº¬ÄǸö¾Þ´ó¡¢¸´ÔÓµÄif-elseµÄÀà¡£¸ÃÀàÖгÖÓÐÁËState¶ÔÏ󣬱íʾµ±Ç°ÒªÖ´ÐеÄ״̬¶ÔÏó¡£

ContextÀà±ØÐëÒªÓÐÒ»¸ödoCurStateº¯Êý£¬¸Ãº¯ÊýµÄ´úÂë¶¼Ò»Ñù£ºstate.doAction()

¿ªÆô״̬ÅжϹý³ÌµÄ´úÂëÈçÏ£º

// ×¼±¸ºÃµÚÒ»¸ö״̬
StateA stateA = new StateA();
// ÉèÖõÚÒ»¸ö״̬
context.setState(stateA);
// ¿ªÊ¼Ö´ÐÐ
context.doCurState();

Óŵã

״̬ģʽ½«Ô­±¾ÔÚÒ»¸öÀàÖеÄÅÓ´óµÄif-else²ð·Ö³ÉÒ»¸ö¸ö¶ÀÁ¢µÄ״̬Àà¡£Ô­±¾Õâ¸ö°üº¬ÅÓ´óif-elseµÄÀà³ÉΪContext£¬°üº¬Á˵±Ç°µÄ״̬¡£ContextÖ»ÐèÒªÖªµÀÆðʼ״̬À༴¿É£¬²»ÐèÒªÖªµÀÆäËû״̬ÀàµÄ´æÔÚ¡£Ò²¾ÍÊÇContextÖ»ÓëµÚÒ»¸ö״̬Àà·¢ÉúñîºÏ¡£¶øÃ¿Ò»¸ö״̬ÀàÖ»ºÍÏÂÒ»¸ö״̬Àà·¢ÉúñîºÏ£¬´Ó¶øÐγÉÒ»Ìõ״̬ÅжÏÁ´¡£×´Ì¬ÀàÖ®¼äµÄñîºÏͨ¹ýSpring XMLÎļþÅäÖá£ÕâÑù£¬µ±ÅжÏÂß¼­·¢Éú±ä»¯µÄʱºò£¬Ö»ÐèÒªÐÂÔö״̬À࣬²¢Í¨¹ýÐÞ¸ÄXMLµÄ·½Ê½½«ÐµÄ״̬Àà²åÈëµ½ÅжÏÂß¼­ÖС£´Ó¶øÂú×ãÁË¿ª·Å·â±ÕÔ­Ôò¡£

´úÀíģʽ

. ´úÀíģʽ

´úÀíģʽÊÇÔÚ²»¸Ä±äÄ¿±êÀàºÍʹÓÃÕßµÄǰÌáÏ£¬À©Õ¹¸ÃÀàµÄ¹¦ÄÜ¡£

´úÀíģʽÖдæÔÚ¡ºÄ¿±ê¶ÔÏ󡻺͡º´úÀí¶ÔÏ󡻣¬ËüÃDZØÐëʵÏÖÏàͬµÄ½Ó¿Ú¡£Óû§Ö±½ÓʹÓôúÀí¶ÔÏ󣬶ø´úÀí¶ÔÏó»á½«Óû§µÄÇëÇ󽻸øÄ¿±ê¶ÔÏó´¦Àí¡£´úÀí¶ÔÏó¿ÉÒÔ¶ÔÓû§µÄÇëÇóÔö¼Ó¶îÍâµÄ´¦Àí¡£

Java¶¯Ì¬´úÀíµÄʹÓÃ

Ê×ÏÈÄãµÃÓµÓÐÒ»¸öÄ¿±ê¶ÔÏ󣬸öÔÏó±ØÐëҪʵÏÖÒ»¸ö½Ó¿Ú£º

public interface Subject
{
public void doSomething();
}
public class RealSubject implements Subject
{
public void doSomething()
{
System.out.println( "call doSomething()" );
}
}

Æä´Î£¬ÎªÄ¿±ê¶ÔÏóÔö¼Ó¶îÍâµÄÂß¼­£º

×Ô¶¨ÒåÒ»¸öÀ࣬²¢ÊµÏÖInvocationHandler½Ó¿Ú£»

ʵÏÖinvokeº¯Êý£¬²¢½«ÐèÒªÔö¼ÓµÄÂß¼­Ð´Ôڸú¯ÊýÖУ»

public class ProxyHandler implements InvocationHandler
{
private Object proxied;
public ProxyHandler( Object proxied )
{
this.proxied = proxied;
}
public Object invoke( Object proxy, Method method, Object[] args ) throws Throwable
{
//ÔÚתµ÷¾ßÌåÄ¿±ê¶ÔÏó֮ǰ£¬¿ÉÒÔÖ´ÐÐһЩ¹¦ÄÜ´¦Àí
//תµ÷¾ßÌåÄ¿±ê¶ÔÏóµÄ·½·¨
return method.invoke( proxied, args);
//ÔÚתµ÷¾ßÌåÄ¿±ê¶ÔÏóÖ®ºó£¬¿ÉÒÔÖ´ÐÐһЩ¹¦ÄÜ´¦Àí
}
}

´´½¨´úÀí¶ÔÏ󣬵÷ÓÃÕßÖ±½ÓʹÓøöÔÏó¼´¿É£º

RealSubject real = new RealSubject();
Subject proxySubject = (Subject)Proxy.newProxyInstance
(Subject.class.getClassLoader(),
new Class[]{Subject.class},
new ProxyHandler(real));
proxySubject.doSomething();
   
3550 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ΪʲôҪ×ö³ÖÐø²¿Êð£¿
ÆÊÎö¡°³ÖÐø½»¸¶¡±£ºÎå¸öºËÐÄʵ¼ù
¼¯³ÉÓë¹¹½¨Ö¸ÄÏ
³ÖÐø¼¯³É¹¤¾ßµÄÑ¡Ôñ-×°ÔØ
 
Ïà¹ØÎĵµ

³ÖÐø¼¯³É½éÉÜ
ʹÓÃHudson³ÖÐø¼¯³É
³ÖÐø¼¯³ÉÖ®-ÒÀÀµ¹ÜÀí
IPD¼¯³É²úÆ·¿ª·¢¹ÜÀí
Ïà¹Ø¿Î³Ì

ÅäÖùÜÀí¡¢ÈÕ¹¹½¨Óë³ÖÐø¼¯³É
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
»ùÓÚAndroidµÄµ¥Ôª¡¢ÐÔÄܲâÊÔ