??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲AV日韩AV高潮无码专区,亚洲色大成网站www永久男同 ,亚洲成人免费网址http://www.tkk7.com/marco/category/7340.html<b>l箋搞“对象”,玩OO.</b> zh-cnWed, 28 Feb 2007 04:17:45 GMTWed, 28 Feb 2007 04:17:45 GMT60Web应用E序安全问题http://www.tkk7.com/marco/archive/2006/03/09/34388.htmlmarcomarcoWed, 08 Mar 2006 16:12:00 GMThttp://www.tkk7.com/marco/archive/2006/03/09/34388.htmlhttp://www.tkk7.com/marco/comments/34388.htmlhttp://www.tkk7.com/marco/archive/2006/03/09/34388.html#Feedback4http://www.tkk7.com/marco/comments/commentRss/34388.htmlhttp://www.tkk7.com/marco/services/trackbacks/34388.html昨天Q以前师兄做的系l因为漏z又被投诉,头让俺做个presentationl实验室下一U同学ȝ一下,避免以后再犯错。今天讲完了放上来Q存个证Q以后也好翻阅沟通?BR>
不涉及主机安全、网l安全、数据库安全Q只从Web应用E序的角度,整理归纳一下面临的主要安全问题?BR>
点击看大图?BR>r_Web应用E序安全问题.jpg



marco 2006-03-09 00:12 发表评论
]]>
<b>Java Web Application开发日志之?lt;/b><br>Q-“design with the think of sharing objects”,Flyweight模式应用http://www.tkk7.com/marco/archive/2006/02/23/32097.htmlmarcomarcoThu, 23 Feb 2006 06:14:00 GMThttp://www.tkk7.com/marco/archive/2006/02/23/32097.htmlhttp://www.tkk7.com/marco/comments/32097.htmlhttp://www.tkk7.com/marco/archive/2006/02/23/32097.html#Feedback4http://www.tkk7.com/marco/comments/commentRss/32097.htmlhttp://www.tkk7.com/marco/services/trackbacks/32097.html


“共享”的思想

׃n?/SPAN>idea是生zM最基本?/SPAN>ideaQ不必有意的使用Q到处已l存在了。在生活中,大部分事物都是被多h多次使用的,q都是共享的实际应用?/SPAN>

 

之于OO的共?/SPAN>

 

OO中的׃nQ无非就是说让“对象”也能被“多人多ơ”(q里的“h”也无非是q程、线E而已Q用,更详l的_是要让对象的生存空间更大一些,生存周期更长一些?/SPAN>

 

自己闷个儿脑子,提炼Z几个需要用共享的环境Q?/SPAN>contextQ,也可以说是原因吧Q?/SPAN>

1.         Z保持“对象”的一_我们需要共享。例如,“国家主席”就一个,不能多了Q如果多了,隑օ决策混ؕ?/SPAN>

2.         Z控制“对象”的存储I间Q我们需要共享。毕竟,目前来说Q系l的memoryq是~程时最珍贵的资源?/SPAN>

3.         Z优化“对象”的创徏消耗,我们需要共享。如果,一个对象的创徏q程消耗太大,pȝ不能支持频繁的创建,׃n的用它也是一个好L?/SPAN>

4.         {等?/SPAN>

 

而在实际的应用中Q往往我ƈ没有l想“我Z么用共享?”,已经不自觉的q了;如果真的认真分析hQ基于的环境也是多样Qƈ不会只是上面的其中一U?/SPAN>

 

常用的“共享”方法或模式Q我曄用过的,知道的不多,望谅解)Q?/SPAN>

1.         ?/SPAN>Singleton模式”:一?/SPAN>class׃个对象实例,大家都用它,满context1?/SPAN>

2.         ?/SPAN>pool技术”:只提供一定数目的对象Q大安用他们,实现context2?/SPAN>context3?/SPAN>

3.         ?/SPAN>flyweight模式”:一?/SPAN>class的一个状态就一个对象实例,实现一个状态对象的׃nQ实?/SPAN>context2?/SPAN>context3?/SPAN>

 

使用时要注意的地方:

1.         定׃n?/SPAN>scope。例如,?/SPAN>Java Web Application中就是选择?/SPAN>pageQ?/SPAN>sessionq是applicationQ当然也可以?/SPAN>jvmU别?/SPAN>static?/SPAN>

2.         thread safe。当׃n的对象可能被多个U程׃nӞq是不可以回避的问题?/SPAN>

3.         应对对象状态的变化。一旦共享的对象发生了变化,我们怎么处理Q改变之Q舍弃之Q也是我们需要确定的?/SPAN>

 

目中的应用Q?/SPAN>

 

目需求:

为学校的同学提供Web查询Q查询的内容有很多。其中,“查课表”、“查考表”是最为关键的需求,以后可能q要提供“查询空闲自习教室”的功能?/SPAN>

在这些查询中Q有一个共同点Q就是都涉及“教室”这一对象。“查课表”时要告诉同学在哪个教室上课Q“查考表”时要告诉同学在哪个教室考试Q等{?/SPAN>

 

数据库设计:

对于“查课表”用例,有关的数据库设计如下Q?/SPAN>
o_5-1-1.jpg 


对象层的设计Q?BR>

o_5-1.JPG
 

学生每查询一门课E的课表Q系l就?/SPAN>sql查询“视?/SPAN>V_LESSONSCHEDULE”,q而生成一?/SPAN>LessonSchedule对象Q然后返回给用户昄。当Ӟ在生成这?/SPAN>LessonSchedule对象的过E中Q属于它?/SPAN>Classroom对象Q以及更׃步的Building?/SPAN>Area对象都会生成。下面就是这个过E的序图:

 

o_5-2.JPG 


因此Q每生成一个“课表”对象(
LessonScheduleQ或“考表”对象(ExamScheduleQ时Q都要:

1.         查数据库中的教室、教学楼、校区的信息Q?/SPAN>

2.         创徏相应的“教室对象”(包括了属于它的“教学楼”对象和“校区”对象)?/SPAN>

 

考虑׃n“教室”对?/SPAN>

“教室”对象一旦可以生成以后,完全可以l后l共享用,不必要每个查询都要去生成?/SPAN>

 

详细说是Z下面的考虑Q?/SPAN>

1.         q类查询用例Q查课表Q查考表Q发生的频繁很高很高Q也是_一旦让用户查v来,pȝ中会产生大量的“教室”对象这cd象,应该说会占很大的内存I间?/SPAN>

2.         ׃n“教室”对象后Q可以减对数据库的查询ơ数Qƈ降低了查询粒度(以前是基于二U视图查询,现在可以Z基本表查询)Q提高了一Ҏ据库查询性能?/SPAN>

 

当然Q同时我脑袋中也有反对的声音Q?/SPAN>

1.         虽说Q这cL询会产生很多相同的“教室”对象,但是JVM本生提供的垃圑֛收功能完全可以处理它。除非,“同时”有很多很多q类对象都在被用,Ҏ回收不了Q才会造成内存短缺?/SPAN>

2.         如果Q我以某U共享机制让q些“教室”对象,在系l中存在下来Qg长了生命周期Q了。而它们本w的数目很多(如,我们学校有××Q,可能q没有等你用上,pȝ已经挂了。另外,如果不是同时有很多查询需要,我留q么多“教室”对象在pȝ里,反而是占了内存Q而不是优化了内存的用?/SPAN>

1.         所有模式的通病――“增加了复杂度”?/SPAN>

 

l论Q?/SPAN>

l过我们分析Q系l对于“教室”对象的重复使用Q频J程度非帔R。一般,?/SPAN>10个h同时使用Q就?/SPAN>5个h左右涉及的用例要使用“教室”对象。把它共享v来,q是有一定必要的?/SPAN>

 

q一步考虑Q?/SPAN>

而实际上Q我们可以进一步共享下去:

除了让客L׃n“教室对象(ClassroomQ”外Q还可以让“教室对象”共享“教学楼对象Q?/SPAN>BuildingQ”,和让“教学楼对象”共享“校区对象(AreaQ”?/SPAN>

因此Q最l的׃n是在三上都实现?/SPAN>

 

Flyweight模式Q?/SPAN>

 

特点Q?/SPAN>

书上_“n元模式可以ɾpȝ中的大量粒度对象被׃n使用”。第一Q对象出现的量要大,惛_q比较好理解Q很用的也就没有必要׃n了;W二Q要粒度,我比较纳PN对于大粒度对象就不行吗?可能书上认ؓQ大_度对象的共享已l占了比较大的空_没有对象那么有效吧?/SPAN>

 

另外Q书上还_要用“n元模式”,被共享的对象的状态(cdQ要比较固定Q这样就可以为每一个状态仅仅创Z个对象。当Ӟ如果每次使用对象Ӟ对象的状态都是不一LQ那根本不存在׃nq些对象的必要了?/SPAN>

 

联系目思考:

Z上面寚w目的分析Q“教室”、“教学楼”、“校区”对象都是在pȝ中会被大量用的对象Q而且_度的确比较;q且它们有固定的cdQ而且不易改变。如校区对象Q暂时就?/SPAN>4个。教学楼可能40Q?/SPAN>50个左叟뀂很适合“n元模式”的使用环境?/SPAN>

 

定׃n方式Q?/SPAN>

1.         定׃n对象?/SPAN>scope。在?/SPAN>webE序中,q些׃n对象?/SPAN>scope理应?/SPAN>applicationQ而更单的一个作法就是把q些对象设ؓstaticQ我选择后者?/SPAN>

2.         thread safe。这些对象是可能被多?/SPAN>servlet讉K的,也就是有可能存在多线E访问。但是,׃q些对象的可变性很差,一旦创建就不大可能变化。因此,我决定把q写׃n对象设计成不变模式的Q一旦创建就只会被读取,而不会改写,q样׃存在多线E控制的问题了?/SPAN>

3.         应对对象状态的变化Q如某个教室的类型变了。这里采取的是舍弃的ҎQؓ每个工厂d了一个清I方法―?/SPAN>clear()Q用于清I已l生成的׃n对象?/SPAN>

 

设计cdQ?/SPAN>

o_5-3.JPG 

当然Q也可以把这些工厂都设计成?/SPAN>Singleton模式”的Q它们只会有一个实例?/SPAN>

 

客户端用:

׃׃n的对象都被包含在了“课表”和“考表”对象里Q不会被客户端直接访问,因而不会对客户端的使用有Q何媄响:

 

实例代码

 
 1//取得~号?2可E的“课表对象?/SPAN>
 2
 3LessonSchedule oneLesson = LessonSchedule.findByLessonNum(32);
 4
 5 
 6
 7//获得教室对象
 8
 9Classroom oneClassroom = oneLesson.getLnkClassroom();
10
11 
12
13//获得教学楼对?/SPAN>
14
15Building oneBuilding = oneClassroom.getLnkBuilding();
16
17 
18
19//获得校区对象
20
21Area oneArea = oneBuilding. getLnkArea();
22
23 
24
25//再次重新生成一个编号ؓ32L“课表对象?/SPAN>
26
27LessonSchedule twoLesson = LessonSchedule.findByLessonNum(32);
28
29 
30
31//获得教室对象
32
33Classroom twoClassroom = twoLesson.getLnkClassroom();
34
35 
36
37//获得教学楼对?/SPAN>
38
39Building twoBuilding = twoClassroom.getLnkBuilding();
40
41 
42
43//获得校区对象
44
45Area twoArea = twoBuilding. getLnkArea();
46

oneClassroom?/SPAN>twoClassroomQ?/SPAN>oneBuilding?/SPAN>twoBuildingQ?/SPAN>oneArea?/SPAN>twoArea׃都是32可E的东西Q根据我们的设计意图Q应该实现共享?/SPAN>

而实际上Q它们每对的是同一个对象的引用。因此,实现了预期的设想?/SPAN>

 

ReviewQ?/SPAN>

在本目中,当第一ơ设计出来的时候,我们发现了某些对象恰好有׃n的需要?/SPAN>

 

而更多的实际情况是,q些需要共享的“信息或状态”在设计中ƈ不是那么恰好的表Cؓ“一个对象”的_度Q而是要不包含在一个对象内部,要不p几个对象。在q样的情况下Q共享的设计更多是发生在代码重构阶段而不是第一的设计阶Dc当ӞZ׃n对象而做出的代码重构Q最重要的一步就是把需要共享的“信息或状态”设计成为新的对象?/SPAN>

 

对于Q“n元模式”来_是要把需要共享的“信息或状态”设计成“n元对象”。别的在此就不说了,因ؓ我也不懂了,呵呵?/SPAN>


                                          MARCO ZHANG 2006q??3?3:48:49



marco 2006-02-23 14:14 发表评论
]]>
<b>Java Web Application开发日志之?lt;/b><br>Q-“make the method become dynamic”,“洋葱”模式应?/title><link>http://www.tkk7.com/marco/archive/2006/02/18/31429.html</link><dc:creator>marco</dc:creator><author>marco</author><pubDate>Sat, 18 Feb 2006 15:53:00 GMT</pubDate><guid>http://www.tkk7.com/marco/archive/2006/02/18/31429.html</guid><wfw:comment>http://www.tkk7.com/marco/comments/31429.html</wfw:comment><comments>http://www.tkk7.com/marco/archive/2006/02/18/31429.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.tkk7.com/marco/comments/commentRss/31429.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/marco/services/trackbacks/31429.html</trackback:ping><description><![CDATA[<H3 style="MARGIN: 13pt 0cm"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=5>废话Q?/FONT></SPAN></H3> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">预料中的日志</SPAN><SPAN lang=EN-US>3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">暂时生不出来,话说难񔞮好Q别夭折pQ有Ҏ价哦Q呵c?/SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p><FONT size=4> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4>因ؓ有些东西q没有想清楚。那先搞个四吧Q这个东西还是清楚那么一点的?/FONT></SPAN></P> <H3 style="MARGIN: 13pt 0cm"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=5>一版描qͼ</FONT></SPAN></H3> <TABLE class=MsoNormalTable style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 5.4pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellSpacing=0 cellPadding=0 border=1> <TBODY> <TR style="HEIGHT: 30.8pt; mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"> <TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 72pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 30.8pt; mso-border-alt: solid windowtext .5pt" width=96> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: navy; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目需?/SPAN><SPAN lang=EN-US style="COLOR: navy"><o:p></o:p></SPAN></B></P></TD> <TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 342pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 30.8pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=456> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使每?/SPAN><SPAN lang=EN-US>servlet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">能对用户讉K权限q行查。简单来_是要给每个</SPAN><SPAN lang=EN-US>servlet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">加个锁,有钥匙的用户才能讉K?/SPAN></P></TD></TR></TBODY></TABLE> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p> </o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而项目中用户所谓的讉K权限是基于他拥有的角艌Ӏ也是_</SPAN><SPAN lang=EN-US>servlet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对用戯问权限的查,是对他所拥有角色的检查。暂Ӟ每个用户只能拥有一个角艌Ӏ?/SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=4> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目的角色很多,但是?/SPAN><SPAN lang=EN-US>web</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">端暂时只有如下的三种Q?/SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p> </o:p></SPAN></P> <TABLE class=MsoNormalTable style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 5.4pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellSpacing=0 cellPadding=0 border=1> <TBODY> <TR style="HEIGHT: 30.8pt; mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"> <TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 90pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 30.8pt; mso-border-alt: solid windowtext .5pt" width=120> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: navy; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">目暂时角色</SPAN><SPAN lang=EN-US style="COLOR: navy"><o:p></o:p></SPAN></B></P></TD> <TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 324pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 30.8pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" width=432> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">游客Q学生,教师</SPAN></P></TD></TR></TBODY></TABLE> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p> </o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">既然q样Q?/SPAN><SPAN lang=EN-US>servlet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的加锁方式就有:</SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p> </o:p></SPAN></P> <TABLE class=MsoNormalTable style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 5.4pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellSpacing=0 cellPadding=0 border=1> <TBODY> <TR style="HEIGHT: 30.8pt; mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"> <TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e0e0e0; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 90pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 30.8pt; mso-border-alt: solid windowtext .5pt" width=120> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B style="mso-bidi-font-weight: normal"><SPAN lang=EN-US style="COLOR: navy">servlet</SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: navy; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">加锁方式</SPAN><SPAN lang=EN-US style="COLOR: navy"><o:p></o:p></SPAN></B></P></TD> <TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 324pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 30.8pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" width=432> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><SPAN lang=EN-US><SPAN style="mso-spacerun: yes"> </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">游客Q学生,教师Q?BR>游客或学生,游客或教师,学生或教师,<BR>游客或学生或教师</SPAN></P></TD></TR></TBODY></TABLE> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="COLOR: #993300; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"> <FONT size=4>注:上面的“游客”就是“游客角色有权访问”的意思,依此cL?/FONT></SPAN><SPAN lang=EN-US style="COLOR: #993300"><o:p></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT size=4> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q里只有关系“或”(</SPAN><SPAN lang=EN-US>||</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q,如果一?/SPAN><SPAN lang=EN-US>servlet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的加锁方式是“学生或教师”,也就是说拥有学生或教师角色的用户都可以访问它。关pZ与”(</SPAN><SPAN lang=EN-US>&&</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q在q里不太可能存在Q因为没有需求说Q某?/SPAN><SPAN lang=EN-US>servlet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一定只能由“既是学生又是教师的用户”才能访问,而且前面也说了,暂时一个用户“有且只有”一个角艌Ӏ?/SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p> </o:p></SPAN></P> <TABLE class=MsoNormalTable style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BACKGROUND: #ccffff; MARGIN: auto auto auto 14.4pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellSpacing=0 cellPadding=0 border=1> <TBODY> <TR style="HEIGHT: 15.75pt; mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"> <TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 396pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 15.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt" vAlign=top width=528> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US>So we can get following function</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?BR></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 黑体"><BR>“加锁方式数?Q?SPAN lang=EN-US> 2</SPAN>的“角色数”次?Q?SPAN lang=EN-US> 1<BR><o:p></o:p></SPAN></SPAN></B></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><BR>“加锁方式数”是关于“角色数”的指数函数Q也是说它是关于“角色数”成“指数”增长的Q应该说很快了吧?BR></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><BR>3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个角色就?/SPAN><SPAN lang=EN-US>2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN><SPAN lang=EN-US>3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">ơ方Q?/SPAN><SPAN lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个,也就?/SPAN><SPAN lang=EN-US>7</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个加锁方式?/SPAN></P></TD></TR></TBODY></TABLE> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p> </o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q用</SPAN><SPAN lang=EN-US>OO</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的最基本方式Q就是封装对象。既然有?/SPAN><SPAN lang=EN-US>servlet</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">“看门”的责QQ那把q个责Q装成一个对象,用个俗名Q?/SPAN><SPAN lang=EN-US>validator</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p> </o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4>接着Q运用共性和个性的分析ҎQ既然有那么多种不同的看门方式(加锁方式Q,那就搞一个接口,然后让各U“不同”都实现q个接口QŞ成子cR那有下面的图Q?/FONT><BR><BR><IMG height=511 alt=o_4-1.JPG src="http://www.tkk7.com/images/blogjava_net/marco/7574/o_4-1.JPG" width=616 border=0><BR><BR></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以看到Q由于有</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">7</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个加锁方式,那就要有</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">7</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个子cR每个子cL据自己逻辑</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">override</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">validate</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Ҏ?/SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=4> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q样Q对于一?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">servlet</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q想让它上什么样的锁Q只要让它拿到对应的子类的引用即可,如下图中?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">ClientServlet</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q我们规定只能有“学生或教师”才能访问它。它的部分代码便是:</SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><BR><IMG height=512 alt=o_4-2.JPG src="http://www.tkk7.com/images/blogjava_net/marco/7574/o_4-2.JPG" width=620 border=0></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"> </P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"> </P> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">1</SPAN><IMG src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">new对应的Validator接口的子cR?BR></SPAN><SPAN style="COLOR: #008080">2</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">q里是学生或教师可访问,因此要new Student_Or_Teacher_Validator</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">3</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #000000">Validator validator </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000"> Student_Validator();<BR></SPAN><SPAN style="COLOR: #008080">4</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">然后调用验证Ҏ可以了</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #008080">5</SPAN><SPAN style="COLOR: #008000"><IMG src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">boolean</SPAN><SPAN style="COLOR: #000000"> ok </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> validator.validate();</SPAN></DIV></SPAN><BR> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4>xQ第一个解x案就出来了?/FONT><BR></P> <H3 style="MARGIN: 13pt 0cm"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=5>思考:</FONT></SPAN></H3> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"> <TABLE class=MsoNormalTable style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 5.4pt; BORDER-LEFT: medium none; WIDTH: 441pt; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellSpacing=0 cellPadding=0 width=588 border=1> <TBODY> <TR style="HEIGHT: 24pt; mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"> <TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #99ccff; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 36pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 24pt; mso-border-alt: solid windowtext .5pt" width=48> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">不</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></P></TD> <TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 405pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 24pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=540> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman">validator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口的子cL目随“角色数”成“指数”增长,数量太多Q而且子类中重复逻辑的代码很多,如?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Student_Or_Teacher_Validator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”就重复了?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Student_Validator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”和?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Teacher_Validator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”的逻辑Q万一?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Student_Validator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”的逻辑要改Q只要涉?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Student</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的子c都要跟着改,l护上不方便?/SPAN></P></TD></TR></TBODY></TABLE></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman"> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"> <TABLE class=MsoNormalTable style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; MARGIN: auto auto auto 5.4pt; BORDER-LEFT: medium none; WIDTH: 441pt; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insideh: .5pt solid windowtext; mso-border-insidev: .5pt solid windowtext" cellSpacing=0 cellPadding=0 width=588 border=1> <TBODY> <TR style="HEIGHT: 6.75pt; mso-yfti-irow: 0; mso-yfti-firstrow: yes; mso-yfti-lastrow: yes"> <TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #99ccff; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 54pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 6.75pt; mso-border-alt: solid windowtext .5pt" width=72> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align=center><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q一步改q的可能</SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></P></TD> <TD style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 387pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid; HEIGHT: 6.75pt; BACKGROUND-COLOR: transparent; mso-border-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt" vAlign=top width=516> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Student_Or_Teacher_Validator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cZ的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">validate</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Ҏ很大E度上就是?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Student_Validator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cZ的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">validate</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Ҏ和?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Teacher_Validator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cZ的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">validate</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Ҏ“或操作”出来的l果?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman"> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">因此Q能不能考虑由?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Student_Validator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cȝ</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">validate</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Ҏ”和?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Teacher_Validator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">validate</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Ҏ?B style="mso-bidi-font-weight: normal"><SPAN style="COLOR: red">动态的构?/SPAN></B>一个功能如?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Student_Or_Teacher_Validator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">cȝ</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">validate</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Ҏ”?/SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman"> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q样Q?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Student_Or_Teacher_Validator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”就可以省略了,只剩下一些原子的“角色类”。要实现</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Student_Or_Teacher_Validator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的验证功能,?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Student_Validator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Teacher_Validator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">装配一下就可以了?/SPAN></P></TD></TR></TBODY></TABLE></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman"> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">l论Q需要根据实际情况,动态的改变Q装配)?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Validator</FONT></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口对象”的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">validate</FONT></SPAN></B><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Ҏ?/SPAN><SPAN lang=EN-US><o:p></o:p></SPAN></B></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=4> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4>W一个火花就是“装饰模式”。它可以让客L动态的l装对象的方法。真奇Q?/FONT></SPAN></P> <H3 style="MARGIN: 13pt 0cm"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=5>W二版来?/FONT></SPAN></H3> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><IMG height=460 alt=o_4.JPG src="http://www.tkk7.com/images/blogjava_net/marco/7342/o_4.JPG" width=569 border=0></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman"> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="COLOR: #993300; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注:上图中出C</SPAN><SPAN lang=EN-US style="COLOR: #993300"><FONT face="Times New Roman">AndRelation</FONT></SPAN><SPAN style="COLOR: #993300; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN><SPAN lang=EN-US style="COLOR: #993300"><FONT face="Times New Roman">And</FONT></SPAN><SPAN style="COLOR: #993300; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的一pd角色c,可以暂时省略不看Q因为前面说了,现在q没有“与”关p这个需求。只?/SPAN><SPAN lang=EN-US style="COLOR: #993300"><FONT face="Times New Roman">Or</FONT></SPAN><SPAN style="COLOR: #993300; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的就可以?/SPAN><SPAN lang=EN-US style="COLOR: #993300"><o:p></o:p></SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=4> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4>我喜Ƣ叫q个模式为洋葱模式,一层包一层,最外层对象某方法的逻辑是由内部一层一层对象的同一Ҏl合出来的?/FONT></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=4> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用了这个模式,便不用如一版那样实现那么多子类Q只要实现几个“角色类”即可,q里?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">3</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个(学生角色Q?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Or_Student</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、教师角Ԍ</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Or_Teacher</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、游客角Ԍ</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Or_Guest</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q。所有一版中<B style="mso-bidi-font-weight: normal">别的</B>子类都可以由q?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">3</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个组装出来?/SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=4> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如要生成一版中?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Student_Or_Teacher_Validator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象Q可以用</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Or_Student</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Or_Teacher</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">两个对象?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Or</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”出来:</SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman"> </FONT></o:p></SPAN><SPAN lang=EN-US><FONT face="Times New Roman"></P> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">1</SPAN><IMG src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">Validator validator </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000"> Or_Student(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000"> Or_Teacher(OrRelation(req)));</SPAN></DIV> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></FONT></SPAN><SPAN lang=EN-US><o:p><FONT face="Times New Roman"> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如要生成一版中?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Guest_Or_Student_Or_Teacher_Validator</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象Q可以用</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Or_Student</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Or_Teacher</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Or _Guest</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">三个对象?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Or</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">”出来:</SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman"></FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><FONT face="Times New Roman"> </P> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #008080">1</SPAN><IMG src="http://www.tkk7.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">Validator validator </SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000"> </SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000"> Or_Student(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000"> Or_Teacher(</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000"> Or_Guest(OrRelation(req))));</SPAN></DIV> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></FONT></SPAN> </P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman"> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q种一层包一层的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">new</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方式Q是不是很像z葱Q第一ơ看是很不习惯,看多了就觉得习惯了?/SPAN></FONT></P> <H3 style="MARGIN: 13pt 0cm"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=5>对客L的媄响:</FONT></SPAN></H3> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4>一版中Q客L要什么样的验证类Q就直接使用具体cR?/FONT></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">二版中,客户端要什么样的验证类Q它的工作多了那么一丁点Q它需要先l装一下,正如上面的例子。这U组装的Ҏ很易于理解和使用Q不会给客户端带来Q何的不便。如果实在觉得客Ll装不出来(?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">B</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">客户端)Q也可以搞个工厂l它</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">supply</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q?/SPAN></FONT></P> <H3 style="MARGIN: 13pt 0cm"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=5>优点Q?/FONT></SPAN></H3> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; tab-stops: 42.75pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT size=4>相对一版最明显的优点就是类的数目少了很多?/FONT></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; tab-stops: 42.75pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=4> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; tab-stops: 42.75pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一版不是说“指数”吗Q这里只是线性的了。假设某一天系l拓展到?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">10</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个角Ԍ一版就?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">2</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">10</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">ơ方那么多个Q也是</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">1024</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个验证类?/SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; tab-stops: 42.75pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=4> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; tab-stops: 42.75pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而二版还?/SPAN><SPAN lang=EN-US><FONT face="Times New Roman">10</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个角色类Q别的都可以在客L使用的时候,动态的l装</SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; tab-stops: 42.75pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=4> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">更重要的是代码结构好了,重复逻辑了。每个逻辑都以最</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">atomic</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的大放到最应该的地斏V?/SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><SPAN lang=EN-US><o:p><FONT face="Times New Roman" size=4> </FONT></o:p></SPAN></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">q而,l护的代价少多了。如某天“教师角艜y的验证逻辑发生了变化,只要改动</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">Or_Teacher</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一个地方即可?/SPAN></FONT></P> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><FONT size=4>                 MARCO ZHANG 2006q??8?3:49:56<IMG height=19 src="http://www.tkk7.com/Emoticons/beer_mug.gif" width=19 border=0></FONT><BR></SPAN></P><img src ="http://www.tkk7.com/marco/aggbug/31429.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/marco/" target="_blank">marco</a> 2006-02-18 23:53 <a href="http://www.tkk7.com/marco/archive/2006/02/18/31429.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title><b>Java Web Application开发日志之?lt;/b><br>Q-“Ignore how they were created”,工厂Ҏ模式应用http://www.tkk7.com/marco/archive/2006/02/16/30894.htmlmarcomarcoWed, 15 Feb 2006 19:53:00 GMThttp://www.tkk7.com/marco/archive/2006/02/16/30894.htmlhttp://www.tkk7.com/marco/comments/30894.htmlhttp://www.tkk7.com/marco/archive/2006/02/16/30894.html#Feedback8http://www.tkk7.com/marco/comments/commentRss/30894.htmlhttp://www.tkk7.com/marco/services/trackbacks/30894.html    说vq个工厂模式Q一时还真不知道该如何说赗反正这是我的开发日志,不提理论的东西,理论的东襉K里都有,我只x具体实践记录下来l师弟师妹们作个参考,U篏点经验。所有这些文字都是集中讲一点――“在什么情况下Z么用某种模式好,Z么好Qؓ什么在那种情况下能惌v来用Q”?/FONT>

       研究生院目中“明䏀用了“工厂方法模式”。其实在遇到具体问题的时候,即我们不知道有q个模式存在Q我们也肯定会造一个类似的东西出来。但是,肯定没有书上的那么好Q那么全面。我惌是看书的好处吧?/SPAN>

 

工厂Ҏ出现的必Ӟ我的理解Q一个很狭隘q幼E理的h的理解)

 

       刚开始用这个东西的时候,只是感觉是单U的一U模式,用于创徏需要的对象?/SPAN>

       但是随着使用和思考的深入Q越发发现它l我的启CZ只在于单U的对象创徏Q而是告诉我应该怎么理解“品”,怎么得到“品”,怎么消费“品”,以至于以后怎么设计“品”?/SPAN>

       下面q个U烦是我对它出现必然性的理解Q?/FONT>

1.         “针Ҏ口编E?/FONT>

  q是OO世界中经典的规范Q不你dq是被动Q你天天都在用这个东ѝ?/SPAN>

    接口是共性的表示Q在对象的世界中Q共性和个性的辩证关系是最重要的关pR在万千的对象中Q通过它们之间的共性和个性,可以形成最基本对象层架构?/SPAN>

假设我们的讨论域中有以下一些对象:“学生”、“大学生”、“小学生”、“中学生”;我们不用l想Q学q一?/SPAN>OO的h都可以ؓq些耳熟能详的对象们Q通过个性和共性的关系得出下面的结构图?BR>

o_1.JPG

 

       把这些对象之间的关系定义成这h理成章的?/SPAN>

       下一步肯定是让客L“用”这个接口啦。也是如下图:

 

o_2.JPG

2.         接口和具体类的矛?/FONT>

勿庸|疑Q我们只希望Client跟接?/SPAN>Student打交道,让它Ҏ׃知道Student有哪些子c,l对不希望直接跟它们打交道?/SPAN>

但这里出现的困难是,接口都是“假”的Q都是由具体c?/SPAN>upcast的?/SPAN>

如果Client要用接?/SPAN>StudentQ?/SPAN>Client中必M出现下面的代码:

Student marco = new Small_Student();

       只要一出现q个代码Q就说明Client不只?/SPAN>Student打交道了Q它知道?/SPAN>Small_Studentc,q违反了我们预先的想法?/SPAN>

3.         䏀h”帮我去创徏“接口对象?/FONT>

    从上图体现出来的l构看,Client只想?/SPAN>Student打交道的目的是实C了的了?/SPAN>

       最单的Ҏ是扑֏外的“帮手”去帮我生成q个“接口对象”。这个帮手它知道“接口对象”的具体cdQ但是它为客L提供的却一定是“接口类型”。这q合我们的要求了。如图:

o_3.JPG

    q样Q?/SPAN>Client可以既用到了?/SPAN>Student接口对象”,又不用因为“只有具体类才能创徏对象”的规则Q而必d其子cȝ构有完全的了解。它成功的解决了2中的矛盾?/SPAN>

       而“负责创建具体类对象的Q务”全部都落在了这个“帮手”n上,q个“帮手”(Student_FactoryQ就是工厂模式中的工厂类Q更具体的说Q它是“简单工厂模式”中的“简单工厂类”?/SPAN>

       我觉得,即一炚w不知道工厂模式,一旦我遇到?/SPAN>2里说的矛盾,我也会用q样的方法处理?/FONT>

4.         q个“帮手”不W合“开Q闭原则?/FONT>

q个帮手的确不错了,而且一跃成为系l中最重要的对象了Q所有“创建具体类的逻辑”都放进MQ也是因ؓ重要Q万一挂了不就惨了?/FONT>

再者,它不W合“开Q闭”原则,我不能在不修改这个帮手的情况下添加Q何一个品。在q个例子中就是,如果那天我有病非要加一个“幼儿园学生”进来,那您必M改这个“帮手”的代码了,q个“帮手”现在就变成Version2Q如下图Q了Q这个二版的帮手Q可以在“代码”层实现对一版(q没有添加幼儿园学生之前)的通用Q但q种保证在“开Q闭”原则看来,q是不够的,不保险的Q它要的是在cȝl构上的保证。声明一下,q是我很感性的理解Q不正确的可能性很高?BR>
o_4.JPG

5.         让“帮手”也多?/FONT>

q里可以试让“帮手”也多态一下,q样“每U学生类创徏的Q务”都被分zֈ了多态出来的cMM。这Ӟ再有新的学生cd加进来,d一个对应的帮手可以了。这栯然类多了一些,但是W合“开Q闭”原则,书上UC为“工厂方法模式”。如图:

o_5.JPG

    假如Client现在要用一个小学生Q代码如下:

1        //创徏一个小学生工厂c这个帮?/SPAN>
2        Student_Factory factory = new Small_Student_Factory();
3        //求助q个帮手Q帮我创Z?/SPAN>

4        Student primaryStudent = factory.produce();
5        //q时可以用这个小学生了,让它玩玩游戏?/SPAN>

6        primaryStudent.playGames();
7

    在这里还是要两点Q?/FONT>

n         虽然实际?/SPAN>Client的确使用了一个小学生对象Q?/SPAN>Small_StudentQ,但这?/SPAN>Client也认为它是Student对象Q这里一定要?/SPAN>Student接口来隐藏它的具体类?/SPAN>

n         另外Q却不需要用Student_Factoryq个接口来隐藏它的具体类Q因为,Client实际是通过“选择它的具体cZ这招儿来“选择创徏的学生类型”。这里的Student_Factory更多的功能不是“隐藏”具体类Q而是“规范”具体类?/SPAN>

 

目实践

 

       扯E到此Q该联系我们的项目啦?/SPAN>

       ׃是做研究生院的项目,其中巨大的需求就是要让同学能在网上提交各U申请单Q申请退学的Q申误{专业的,甌复学的,甌保留学籍的,除了甌x友的外,应有有?/SPAN>       对于q些单子Q用最最基本OO思维Q根据共性个性分析方式,抽象Z个申请单接口Q和若干的具体类?/SPAN>

       当然Q除了概念上感性上d以外Q在目中它们也要“真”的有巨大的共性才行,如都要提交,修改Q删除,审核Q打印等功能?/SPAN>

       靠,既然都这样了Q肯定就用一接口规定它了?/SPAN>

       惛_q里Q加上有了上面的思考,不用说了Q就用工厂方法模式啦?BR>

 

o_6.JPG

    图中Ent_Shift是甌单接口。等于前面分析的Student接口。还可以看到有很多具体类Q前面例子中是代表各U学生,q里是代表各种甌单?/SPAN>

       当然Q这里还有很多工厂,也就是前面一直叫的“帮手”?BR>

o_7.JPG

       Bean_Shift是工厂接口Q相当于前面?/SPAN>Student_Factory接口。还有很多的具体cd是生产各U申请单的工厂类?/SPAN>

       下面是使用“申请单工厂Ҏ模式”的一D客L代码Q?BR>

 1        //声明甌单接?/SPAN>
 2        Ent_Shift es = null;
 3        //声明甌单工厂接?/SPAN>

 4        Bean_Shift bs = null;
 5        //Ҏ传入的申请单cd数字w成对应的申请单工厂

 6        switch (shiftTypeID) {
 7            case
 Bean_Shift.SHIFT_CHANGETEAAP :
 8                bs = new
 Bean_Shift_CHANGETEAAP();
 9                break
;
10            case
 Bean_Shift.SHIFT_RESERVEAP :
11                bs = new
 Bean_Shift_RESERVEAP();
12                break
;
13            case
 Bean_Shift.SHIFT_RENEWAP :
14                bs = new
 Bean_Shift_RENEWAP();
15                break
;
16             //省略了别的申请单…………………?/SPAN>

17            default :
18                this.forwardErr(req, resp, "所选择的异动类别不存在"
);
19        }

20
21        try 
{
22            //调用工厂接口的生产方?/SPAN>

23            es = bs.getBlankShift(stuID);
24
            
25        }
 catch (Exception e) {
26            this
.forwardErr(req, resp, DB_ERROR);
27        }

28        //调用单子的提交方?/SPAN>
29        es.submit(req);
30
        
31        //发给面LC?/SPAN>

32        es.fowrardWithSessionObject(
33
                req,
34
                resp,
35
                Ent_Shift.nameInSessionAndRequest);
36

 

升华

 

       个h比较同意?/SPAN>Design Pattern Explained》中作者讲的,要用好很多的模式Q其中都有一个思\Q就是用接口或抽象类来隐藏子cȝ不同?/SPAN>

       我每当看到这Ӟ老是会被一U思\困扰――?/SPAN>new只能new具体cdQ这咋能隐藏呢,q隐藏还有什么用呢?”?/SPAN>

       作者仿佛也曄有过我的q个?/SPAN>B苦恼Q它的解x法就是:Ҏ在用对象的时候,特别是设计阶D,量不去惛_象是在那里被new的。他认ؓQ反正有了工厂模式后Q你L办法把他?/SPAN>new出来的?/SPAN>

       所以,我用了工厂模式后更发的启发是Q以后设计的时候不要想一?/SPAN>Client怎么创徏一个对象,管攑ֿ大胆的先l箋惻I直接使用好了。反正最后我q有工厂模式呢?/SPAN>

       因此俺的副标题才是?/SPAN>Ignore how they were created”,呵呵?BR>                                    MARCO ZHANG 2006q??6?:52:10



marco 2006-02-16 03:53 发表评论
]]>
<b>Java Web Application开发日志之一</b><br>Q-自己设计易frameworkhttp://www.tkk7.com/marco/archive/2006/02/10/30078.htmlmarcomarcoThu, 09 Feb 2006 21:48:00 GMThttp://www.tkk7.com/marco/archive/2006/02/10/30078.htmlhttp://www.tkk7.com/marco/comments/30078.htmlhttp://www.tkk7.com/marco/archive/2006/02/10/30078.html#Feedback1http://www.tkk7.com/marco/comments/commentRss/30078.htmlhttp://www.tkk7.com/marco/services/trackbacks/30078.html阅读全文

marco 2006-02-10 05:48 发表评论
]]>
վ֩ģ壺 ƷһһƵ| ձ뿨23| ִӲִֻƵƵѿ | ˸һþ| Ƶѹۿ| vva| ƷԺ| õӰ߹ۿ| й߹ۿѹ| պþۺĻ| ŮƵ| ŮǿڸˬƵ| ޾Ʒһ³˿Ƭ| ߹ۿѻɫַ| 337pձŷ޴| 97ѹۿƵ߹ۿ| ɫ͵Ʒһ| ѹŮˬˮƵ| 1024Ʒ| ޹Ʒþ| Ƶһ| һëƬѹۿƵ| ɫ6 | ѵȫһ¼| վѹۿ| ŷŮƵ| hƵ߹ۿ| ɫͼƵ߹ۿ| ƷŮ߳鴤վ| 51ҹƷƵ| ձva߹ۿ| ƷҹѸ| Ƶ߹ۿ| ޾Ʒһ23Ŀ| պһ| ձ岻aվ| videosbestsexձ| Ʒ޸һ| ƷԺ| Ʒϵ߹ۿ| վ߹ۿ|