ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>国产久一道中文一区,中文字幕电影在线,h视频在线免费http://www.aygfsteel.com/abin/category/52889.htmlzh-cnWed, 24 Oct 2012 10:17:23 GMTWed, 24 Oct 2012 10:17:23 GMT60深入‹¹…出java命ä×o模式 http://www.aygfsteel.com/abin/archive/2012/10/24/390182.htmlabingabingWed, 24 Oct 2012 10:04:00 GMThttp://www.aygfsteel.com/abin/archive/2012/10/24/390182.htmlhttp://www.aygfsteel.com/abin/comments/390182.htmlhttp://www.aygfsteel.com/abin/archive/2012/10/24/390182.html#Feedback0http://www.aygfsteel.com/abin/comments/commentRss/390182.htmlhttp://www.aygfsteel.com/abin/services/trackbacks/390182.html一、引­a€

 

忙里偷闲åQŒç»ˆäºŽåЍ½W”了。命令模式是从界面设计中提取出来的一¿Uåˆ†¼›»è€¦åˆåQŒæé«˜é‡ç”¨çš„æ–ÒŽ³•ã€‚è¢«è®¤äØ“æ˜¯æœ€ä¼˜é›…è€Œä¸”½Ž€å•的模式åQŒå®ƒçš„应用范围非常广泛。让我们一èµäh¥è®¤è¯†ä¸‹å®ƒå§ã€?br />
 

先从èµähºè¯´è“v。在设计界面æ—Óž¼Œå¤§å®¶å¯ä»¥æ³¨æ„åˆ°è¿™æ ïLš„一¿Uæƒ…况,同样的菜单控ä»Óž¼Œåœ¨ä¸åŒçš„应用环境中的功能是完全不同的åQ›è€Œèœå•选项的某个功能可能和鼠标右键的某个功能完全一致。按照最差、最原始的设计,˜q™äº›ä¸åŒåŠŸèƒ½çš„èœå•ã€æˆ–è€…å³é”®å¼¹å‡ø™œå•是要分开来实现的åQŒä½ å¯ä»¥æƒŒ™±¡ä¸€ä¸‹ï¼Œword文档上面的一排菜单要实现出多ž®‘个“形似¼œžéž”的菜单类来?˜q™å®Œå…¨æ˜¯è¡Œä¸é€šçš„。这æ—Óž¼Œž®Þp¦˜qç”¨åˆ†ç¦»å˜åŒ–与不变的因素åQŒå°†èœå•触发的功能分¼›Õd‡ºæ¥ï¼Œè€Œåˆ¶ä½œèœå•的时候只是提供一个统一的触发接口。这样修改设计后åQŒåŠŸèƒ½ç‚¹å¯ä»¥è¢«ä¸åŒçš„èœå•æˆ–è€…å³é”®é‡ç”¨ï¼›è€Œä¸”èœå•æŽ§äšg也可以去除变化因素,很大的提高了重用åQ›è€Œä¸”分离了显½Cºé€»è¾‘和业务逻辑的耦合。这便是命ä×o模式的雏形ã€?br />
 

下面我们ž®†ä»”¾l†çš„讨论下命令模式ã€?br />
 

 

二、定义与¾l“æž„

 

《设计模式》中命ä×oæ¨¡å¼çš„å®šä¹‰äØ“åQšå°†ä¸€ä¸ªè¯·æ±‚å°è£…äØ“ä¸€ä¸ªå¯¹è±¡ï¼Œä»Žè€Œä‹É你可用不同的è¯äh±‚对客戯‚¿›è¡Œå‚数化åQ›å¯¹è¯äh±‚排队或记录请求日志,以及支持可撤消的操作ã€?br />
 

看è“v来,命ä×o模式好像¼œžé€šå¹¿å¤§ã€‚其实命令模式的以上功能˜q˜è¦çœ‹ä½ æ˜¯æ€Žä¹ˆå†™çš„——½E‹åºæ€ÀL˜¯½E‹åºå‘˜å†™å‡ºæ¥çš„,你写啥它才能òq²å•¥åQšï¼‰

 

       åœ¨æˆ‘看来åQŒå…¶å®žå‘½ä»¤æ¨¡å¼åƒå¾ˆå¤šè®¾è®¡æ¨¡å¼ä¸€æ ?#8212;—通过在你的请求和处理之间加上了一个中间äh的角è‰ÔŒ¼Œæ¥è¾¾åˆ°åˆ†¼›»è€¦åˆçš„目的。通过对中间äh角色的特ŒDŠè®¾è®¡æ¥å½¢æˆä¸åŒçš„æ¨¡å¼ã€‚当然命令模式就是一¿Uç‰¹ŒDŠè®¾è®¡çš„¾l“æžœã€?br />
 

       çœ‹ä¸‹å‘½ä×o模式是有哪些角色来组成的吧ã€?nbsp;            

 

1)        å‘½ä×o角色åQˆCommandåQ‰ï¼šå£°æ˜Žæ‰§è¡Œæ“ä½œçš„æŽ¥å£ã€‚有java接口或者抽象类来实现ã€?br />
 

2)        å…·ä½“命ä×o角色åQˆConcrete CommandåQ‰ï¼šž®†ä¸€ä¸ªæŽ¥æ”¶è€…对象绑定于一个动作;调用接收者相应的操作åQŒä»¥å®žçް命ä×o角色声明的执行操作的接口ã€?br />
 

3)        å®¢æˆ·è§’色åQˆClientåQ‰ï¼šåˆ›å¾ä¸€ä¸ªå…·ä½“命令对象(òq¶å¯ä»¥è®¾å®šå®ƒçš„æŽ¥æ”¶è€…)ã€?br />
 

4)        è¯äh±‚者角è‰ÔŒ¼ˆInvokeråQ‰ï¼šè°ƒç”¨å‘½ä×o对象执行˜q™ä¸ªè¯äh±‚ã€?br />
 

5)        æŽ¥æ”¶è€…è§’è‰ÔŒ¼ˆReceiveråQ‰ï¼šçŸ¥é“如何实施与执行一个请求相关的操作。ä“Q何类都可能作ä¸ÞZ¸€ä¸ªæŽ¥æ”¶è€…ã€?br />
 

 

以下是命令模式的¾cÕd›¾åQŒä»Žä¸­å¯ä»¥å¤§è‡´çš„了解到各个角色之间是怎么来协调工作的ã€?br />
 

 

 

三、ä‹Dä¾?br />
 

本来æƒÏxŽ¥ç€æˆ‘çš„JUnit分析来讲解命令模式。但是由于在JUnit中,参杂了其它的模式在里面,使得命ä×o模式的特点不太明显。所以这里将以命令模式在Web开发中最常见的应ç”?#8212;—Struts中Actionçš„ä‹É用作ä¸ÞZ¾‹å­ã€?br />
 

在Struts中Action控制¾cÀL˜¯æ•´ä¸ªæ¡†æž¶çš„æ ¸å¿ƒï¼Œå®ƒè¿žæŽ¥ç€™åµé¢è¯äh±‚和后åîC¸šåŠ¡é€»è¾‘å¤„ç†ã€‚æŒ‰ç…§æ¡†æž¶è®¾è®¡ï¼Œæ¯ä¸€ä¸ªç‘ô承自Action的子¾c»ï¼Œéƒ½å®žçްexecuteæ–ÒŽ³•——调用后台真正处理业务的对象来完成ä»ÕdŠ¡ã€?br />
 

注:¾l§æ‰¿è‡ªDispatchAction的子¾c»ï¼Œåˆ™å¯ä»¥ä¸€ä¸ªç±»é‡Œé¢å¤„理多个¾cÖM¼¼çš„æ“ä½œã€‚这个在˜q™ä¸åšè®¨è®ºã€?br />
 

       ä¸‹é¢æˆ‘们ž®†Struts中的各个¾cÖM¸Žå‘½ä×o模式中的角色对号入åñ”ã€?br />
 

       å…ˆæ¥çœ‹ä¸‹å‘½ä×o角色——Action控制¾c?br />
 

public class Action {

       ……

         /*

         *可以看出åQŒAction中提供了两个版本的执行接口,而且实现了默认的½Iºå®žçްã€?br />
       
*/

public ActionForward execute( ActionMapping mapping,

                                                  ActionForm form,

                                                  ServletRequest request,

                                                  ServletResponse response)

        throws Exception {

        try {

            return execute(mapping, form, (HttpServletRequest) request,

                                     (HttpServletResponse) response);

        } catch (ClassCastException e) {

            return null;

        }

    }

 

public ActionForward execute( ActionMapping mapping,

                                                  ActionForm form,

                                                   HttpServletRequest request,

                                                  HttpServletResponse response)

        throws Exception {

        return null;

    }

}

 

下面的就是请求者角è‰ÔŒ¼Œå®ƒä»…仅负责调用命令角色执行操作ã€?br />
public class RequestProcessor {

……

protected ActionForward processActionPerform(HttpServletRequest request,

                                                        HttpServletResponse response,

                                                       Action action,

                                                       ActionForm form,

                                                       ActionMapping mapping)

        throws IOException, ServletException {

        try {

            return (action.execute(mapping, form, request, response));

        } catch (Exception e) {

            return (processException(request, response,e, form, mapping));

        }

}

}

 

Struts框架为我们提供了以上两个角色åQŒè¦ä½¿ç”¨struts框架完成自己的业务逻辑åQŒå‰©ä¸‹çš„三个角色ž®Þp¦ç”±æˆ‘们自己来实现了。步骤如下:

1)        å¾ˆæ˜Žæ˜¾æˆ‘们要先实çŽîC¸€ä¸ªAction的子¾c»ï¼Œòq‰™‡å†™executeæ–ÒŽ³•。在此方法中调用业务模块的相应对象来完成ä»ÕdŠ¡ã€?br />
2)        å®žçŽ°å¤„ç†ä¸šåŠ¡çš„ä¸šåŠ¡ç±»ã€?br />
3)        é…ç½®struts-config.xml配置文äšgåQŒå°†è‡ªå·±çš„Actionå’ŒForm以及相应™åµé¢¾l“合èµäh¥ã€?br />
4)        ¾~–写jspåQŒåœ¨™åµé¢ä¸­æ˜¾å¼çš„制定对应的处理Actionã€?br />
一个完整的命ä×o模式ž®×ƒ»‹¾lå®Œäº†ã€‚当你在™åµé¢ä¸Šæäº¤è¯·æ±‚后åQŒStruts框架会根据配¾|®æ–‡ä»¶ä¸­çš„定义,ž®†ä½ çš„Actionå¯¹è±¡ä½œäØ“å‚æ•°ä¼ é€’ç»™RequestProcessor¾cÖM¸­çš„processActionPerform()æ–ÒŽ³•åQŒç”±æ­¤æ–¹æ³•调用Action对象中的执行æ–ÒŽ³•åQŒè¿›è€Œè°ƒç”¨ä¸šåŠ¡å±‚ä¸­çš„æŽ¥æ”¶è§’è‰²ã€‚è¿™æ ·å°±å®Œæˆäº†è¯·æ±‚çš„å¤„ç†ã€?br />
 

四、Undo、事务及延äŽ×

 

在定义中提到åQŒå‘½ä»¤æ¨¡å¼æ”¯æŒå¯æ’¤é”€çš„æ“ä½œã€‚而在上面的ä‹D例中òq¶æ²¡æœ‰ä½“现出来。其实命令模式之所以能够支持这¿Uæ“ä½œï¼Œå®Œå…¨å¾—益于在è¯äh±‚è€…ä¸ŽæŽ¥æ”¶è€…ä¹‹é—´æ·»åŠ äº†ä¸­é—´è§’è‰²ã€‚äØ“äº†å®žçŽ°undo功能åQŒé¦–先需要一个历史列表来保存已经执行˜q‡çš„具体命ä×o角色对象åQ›ä¿®æ”¹å…·ä½“命令角色中的执行方法,使它记录更多的执行细节,òq¶å°†è‡ªå·±æ”‘Ö…¥åŽ†å²åˆ—è¡¨ä¸­ï¼›òq¶åœ¨å…·ä½“命ä×o角色中添加undoæ–ÒŽ³•åQŒæ­¤æ–ÒŽ³•æ ÒŽ®è®°å½•的执行细节来复原状态(很明显,首先½E‹åºå‘˜è¦æ¸…楚怎么来实玎ͼŒå› äؓ它和execute的效果是一æ ïLš„åQ‰ã€?br />
 

同样åQŒredo功能也能够照此实现ã€?br />
 

命ä×o模式˜q˜æœ‰ä¸€ä¸ªå¸¸è§çš„用法ž®±æ˜¯æ‰§è¡Œäº‹åŠ¡æ“ä½œã€‚è¿™ž®±æ˜¯ä¸ÞZ»€ä¹ˆå‘½ä»¤æ¨¡å¼è¿˜å«åšäº‹åŠ¡æ¨¡å¼çš„åŽŸå› å§ã€‚å®ƒå¯ä»¥åœ¨è¯·æ±‚è¢«ä¼ é€’åˆ°æŽ¥æ”¶è€…è§’è‰²ä¹‹å‰ï¼Œ‹‚€éªŒè¯·æ±‚的正确性,甚至可以‹‚€æŸ¥å’Œæ•°æ®åº“中数据的一致性,而且可以¾l“合¾l„合模式的结构,来一‹Æ¡æ‰§è¡Œå¤šä¸ªå‘½ä»¤ã€?br />
 

使用命ä×o模式不仅仅可以解除请求者和接收者之间的耦合åQŒè€Œä¸”可以用来做批处理操作åQŒè¿™å®Œå…¨å¯ä»¥å‘挥你自å·Þqš„æƒŒ™±¡——è¯äh±‚者发出的è¯äh±‚到达命ä×o角色˜q™é‡Œä»¥åŽåQŒå…ˆä¿å­˜åœ¨ä¸€ä¸ªåˆ—表中而不执行åQ›ç­‰åˆîC¸€å®šçš„业务需要时åQŒå‘½ä»¤æ¨¡å¼å†ž®†åˆ—表中全部的操作逐一执行ã€?br />
 

哦,命ä×o模式实在太灵‹zÖMº†ã€‚真是一个很有用的东西啊åQ?br />
 

 

五、优点及适用情况

 

ç”׃¸Šé¢çš„讲解可以看出命ä×o模式有以下优点:

1)        å‘½ä×o模式ž®†è°ƒç”¨æ“ä½œçš„è¯äh±‚对象与知道如何实现该操作的接收对象解耦ã€?br />
2)        å…·ä½“命ä×o角色可以被不同的è¯äh±‚者角色重用ã€?br />
3)        ä½ å¯ž®†å¤šä¸ªå‘½ä»¤è£…配成一个复合命令ã€?br />
4)        å¢žåŠ æ–°çš„å…·ä½“å‘½ä×oè§’è‰²å¾ˆå®¹æ˜“ï¼Œå› äØ“˜q™æ— éœ€æ”¹å˜å·²æœ‰çš„ç±»ã€?br />
GOFæ€È»“了命令模式的以下适用环境ã€?br />
1)        éœ€è¦æŠ½è±¡å‡ºå¾…执行的动作åQŒç„¶åŽä»¥å‚æ•°çš„åŞ式提供出æ?#8212;—¾cÖM¼¼äºŽè¿‡½E‹è®¾è®¡ä¸­çš„回调机制。而命令模式正是回调机制的一个面向对象的替代品ã€?br />
2)        åœ¨ä¸åŒçš„æ—¶åˆ»æŒ‡å®šã€æŽ’列和执行è¯äh±‚。一个命令对象可以有与初始请求无关的生存期ã€?br />
3)        éœ€è¦æ”¯æŒå–消操作ã€?br />
4)        æ”¯æŒä¿®æ”¹æ—¥å¿—功能。这样当¾pȝ»Ÿå´©æºƒæ—Óž¼Œ˜q™äº›ä¿®æ”¹å¯ä»¥è¢«é‡åšä¸€éã€?br />
5)        éœ€è¦æ”¯æŒäº‹åŠ¡æ“ä½œã€?br />
 

六、æ€È»“

 

命ä×o模式是一个很有用的模式,希望˜q™ç¯‡æ–‡ç« èƒ½ç»™ä½ å®žè´¨æ€§çš„帮助。谢谢大家指正ã€?nbsp;v

 

]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÐËÒåÊÐ| Â«É½ÏØ| Íû¶¼ÏØ| ÔÓ¶àÏØ| ÉñÄ¾ÏØ| ÎâÆìÏØ| ÁÙÎ÷ÏØ| ÏæÌ¶ÊÐ| ÀñÈªÏØ| ÄÏ·áÏØ| ¸ßÖÝÊÐ| ¿í³Ç| ±±°²ÊÐ| ´óÒ¦ÏØ| º£Â×ÊÐ| Ë·ÖÝÊÐ| ð¢É½ÏØ| аͶû»¢ÓÒÆì| ³¤ÀÖÊÐ| Áø½­ÏØ| ÄϽ­ÏØ| ÔÓ¶àÏØ| ºÏ½­ÏØ| ¹ðÑôÏØ| ¼ÃÑôÏØ| Íû½­ÏØ| ÄôÀ­Ä¾ÏØ| ×ÓÖÞÏØ| äÀ´¨ÏØ| ÓÀ´ºÏØ| ÐÂç­ÏØ| Ìì¶ëÏØ| ÌÀÔ­ÏØ| ̨¶«ÊÐ| Õ´»¯ÏØ| ÓéÀÖ| ¾ÞÒ°ÏØ| ¶«·½ÊÐ| ËÄ×ÓÍõÆì| ºâÉ½ÏØ| ÎäÂ¡ÏØ|