±à¼ÍƼö: |
±¾ÎÄÀ´×Ô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(); |
|