computer °æ (¾«»ªÇø)
·¢ÐÅÈË: random (arboreal), ÐÅÇø: program
±ê Ìâ: Jive ÖеÄÉè¼ÆÄ£Ê½ (Design Pattern)
·¢ÐÅÕ¾: ÌýÌÎÕ¾ (2001Äê12ÔÂ02ÈÕ21:21:24 ÐÇÆÚÌì), Õ¾ÄÚÐżþ
ÎҼǵÃgutentagµÄÉú²úʵϰ¾ÍÊÇÕâ¸ö¶«¶«¡£¿´¿´±ðÈ˵ġ£
Jive ÖеÄÉè¼ÆÄ£Ê½ (Design Pattern)
¹Ø¼ü×Ö: Jive, Design Pattern.
ʱ¼ä: 2001-4-1
ÕªÒª:
Jive ÊÇÒ»¸ö¿ª·ÅÔ´ÂëµÄÂÛ̳ÏîÄ¿, Ò²¾ÍÊÇÎÒÃÇËù³£¼ûµÄ BBS, ²ÉÓÃÁË SUN
¹«Ë¾µÄ JSP ¼¼Êõ, Ïà±ÈÆð j2ee Õâ¸öÅÓ´óµÄÌåϵ½á¹¹, ÆäÕû¸öµÄÉè¼ÆË¼Ïë·Ç³£
¾«Á¶, ÊÊÓÃÓÚÖÐСÐÍÍøÕ¾, ½¨Á¢×Ô¼ºµÄÂÛ̳ϵͳ. ÕâÆªÎÄÕÂÎÒÃǾÍÒ»ÆðÀ´¿´Ò»¿´
Jive ÖÐËùÓ¦ÓõÄÉè¼ÆÄ£Ê½(Design Pattern).
ÕýÎÄ:
¹ØÓÚÉè¼ÆÄ£Ê½, ÕâÆªÎÄÕ²¢²»Ïêϸ½âÊÍ, Ö»ÊǽáºÏ Jive À´¿´¿´Éè¼ÆÄ£Ê½ÔÚÒ»
¸öʵ¼ÊÏîÄ¿ÖеÄÓ¦Óü°ÆäÕûÌåµÄÉè¼ÆË¼Ïë. ËùÒÔÔÚ¶ÁÕâÆªÎÄÕÂǰ, ¼ÙÉèÄú¶ÔÉè¼ÆÄ£
ʽÓÐÒ»¸ö¸ÐÐÔµÄÈÏʶ, ¶ÔÆä¾ßÌåÓ¦ÓÃÒÔ¼°ÊµÏÖ·½·¨ÓÐЩÒÉÎÊ, ²¢¿ÊÍûÁ˽âÆä˼Ïë,
²¢Ê¹Óùý Jive. ±¾ÎĽ«Ò»Í¬À´Ì½ÌÖÕâ¸öÎÊÌâ. ΪʲôѡÔñ Jive ¶ø²»ÊÇÑ¡ÔñÒ»¸öеÄ
Àý×ÓÖØÐ¿ªÊ¼ÄØ? ÓÐÒÔÏÂÁ½¸öÔÒò: 1, ÎÒÃǺܶàÈË¶Ô bbs ÕâÑùÒ»¸öÊÂÎï±È½ÏÊìϤ,
ºÜÇå³þ bbs Ëù¾ßÓеÄһЩ»ù±¾¹¦ÄÜ, Èç¹û×Ô¼º×÷ΪÉè¼ÆÕßÀ´Éè¼ÆÕâÑùÒ»¸ö web bbs,
»áÔõôÏë, ÔÙ¿´¿´±ðÈËÊÇÔõôʵÏÖµÄ, ÓжԱȲÅÄÜÃ÷°××Ô¼ºÉè¼ÆÉϵÄȱµã, ¿´µ½±ðÈË
µÄÓŵã²ÅÄܸü¿ìµØ½ø²½. 2, Jive ²¢²»ÊǷdz£µØ¸´ÔÓ, ²¢ÇÒ°üÀ¨ÁËÒ»¸öÍêÕûµÄʵÏÖ·½
°¸, ´Óµ×²ãµ½¸ß²ã, ´Óºó¶Ëµ½Ç°¶Ë, ¶¼ÓкܺõÄÎĵµ, ÕâЩ¶¼ÄܸüºÃµØ°ïÖúÎÒÃÇÀí½â
Ëü.
ÕâÀïÎÒÃÇËùÓÃµÄ Jive µÄ°æ±¾²ÉÓÃÆä¿ª·¢Õß×÷ΪÕýʽ·¢²¼µÄ 1.0 °æ, Æä×îаæ
Ϊ 1.21, ¶ÔÆä½á¹¹×÷ÁËÉÙÁ¿¸Ä¶¯, Ö÷ÒªÔö¼ÓÁË jsp tag µÄÖ§³Ö, ÕâÖÖ¼¼Êõ²»ÊôÓÚÎÒ
ÃǵÄÌÖÂÛ·¶Î§, ÒÔºóÓлú»á¿ÉÒÔ¹²Í¬Ñ§Ï°.
Jive ÖÐËùʹÓõÄÉè¼ÆÄ£Ê½, ¶ÔÉè¼ÆÄ£Ê½µÄÈýÖÖÀàÐÍ -- ´´½¨ÐÍ, ½á¹¹ÐÍ,
ÐÐΪÐÍ -- ¶¼ÓÐÉæ¼°, ÕâÑùÒ²ÄܱȽÏÈ«ÃæµØÁ˽âÉè¼ÆÄ£Ê½. ÎÒÃÇÏÈÀ´×Ô¼ºÉè¼ÆÒ»ÏÂ,
ÔËÓÃÃæÏò¶ÔÏóµÄ˼Ïë, ¿ÉÒÔºÜÈÝÒ×ÖªµÀ, Õû¸öϵͳÖ÷ÒªÐèÒªÕ⼸¸ö¶ÔÏó:
1, Forum -- Ò»¸öÌÖÂÛÇø, Ò²¾ÍÊÇÒ»¸ö°æÃæ.
2, Thread -- Ò»ÌõÏßË÷, Ò²¾ÍÊÇÓйØÍ¬Ò»¸öÖ÷ÌâµÄËùÓеĻØÎÄ.
3, Message -- Ò»ÌõÏûÏ¢, Ò²¾ÍÊÇÒ»¸öÓû§·¢µÄһƪÌù×Ó.
(ÒÔºóÎÒÃǾÍÓÃ"Ìù×Ó"Õâ¸ö½Ð·¨)
4, User -- Ò»¸öÓû§, Ò²¾ÍÊÇÌÖÂÛÇøµÄʹÓÃÕß.
ºÃÁË, ÎÒÃÇÐèÒªµÄ¶«Î÷¶¼ÔÚÁË, ËüÃÇÖ®¼äµÄ¹ØÏµÊ®·Ö¸´ÔÓ, Ôõô°ÑËüÃÇ×éÖ¯µØ
ºÜ·ûºÏÎÒÃǵÄ˼·ÓÖÄÜÈÝÒ×À©³äÄØ? ÎÒÏë´ó¼Ò¶¼ÓÐ×Ô¼ºµÄÏë·¨ÁË, "ÎÒÄÜÕâôÕâô×ö",
"ÎÒ¿ÉÒÔÕâÑùÕâÑùÉè¼Æ", ÎÒÃÇÒ»ÆðÀ´¿´¿´ Jive ÊÇÔõô×öµÄ. ÏÂÃæÊÇÆäÕûÌå½á¹¹:
|~~~~~~~~~~~~~~~~~~|
| Skin Éè¼ÆÕß |
|__________________|
| |
| | ʹÓÃ
\ /
|~~~~~~~~~~~~~~~~~|
| ¸÷ÖÖ¶ÔÏóµÄ½Ó¿Ú |
|_________________|
| |
| | ±»ÊµÏÖ
\ /
|~~~~~~~~~~~~|
| ȨÏÞ¿ØÖÆ |
|____________|
| |
| | ¿ØÖÆ
\ /
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| ¶ÔÊý¾Ý¿â½øÐвÙ×÷µÄ¸÷ÖÖ¶ÔÏó |
|_____________________________|
| |
| | È¡Á¬½Ó
\ /
|~~~~~~~~~~~~~~~~|
| Êý¾Ý¿âÁ¬½Ó³Ø |
|________________|
(ͼ 1)
ÏÂÃæÊÇÆäÀàµÄ´ó¸ÅµÄ¼Ì³ÐÇé¿ö:
|~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
| Interface A |
|___________________________________|
| |
| implements |
| |
|~~~~~~~~~~~~~~~~~| |
| Proxy A | |
|_________________| |
|
|
|~~~~~~~~~~~~~~~~~~|
| Database A |
|__________________|
(ͼ 2)
ºÃÁË¿´µ½ÕâÀï, Èç¹ûÄú¶ÔÉè¼ÆÄ£Ê½ÓÐÁ˽âµÄ»°, ´ÓÉÏÃæËùдµÄαÃû×ÖÖÐ, ¿ÉÒÔ
¿´µ½Ò»Ð©ÊìϤµÄ¶«Î÷. ÇëÈÃÎÒ×öһЩ½âÊÍ. ÉÏÃæµÄͼ±íʾµÄÊÇÀàµÄ¼Ì³Ð¹ØÏµ, A ´ú
±íÉÏÃæËùÌáµ½µÄËÄÖÖ¶ÔÏó, Interface A ±íʾÃûΪ A µÄÒ»¸ö½Ó¿Ú, ÏàÐÅ´ó¼Ò¶Ô½Ó¿Ú
¶¼²»Ä°Éú, ½Ó¿ÚÔÚ java ÖÐÓÐ×ÅÖØÒªµÄ×÷ÓÃ. Proxy A ±íʾһ¸öÃûΪ ProxyA µÄÀà,
ʵÏÖ A ½Ó¿Ú. Database A ±íʾÃûΪ DbA µÄÒ»¸öÀà, ʵÏÖ A ½Ó¿Ú. µ«Éè¼ÆÄ£Ê½²¢
ûÓдÓÖÐÌåÏÖ³öÀ´,Éè¼ÆÄ£Ê½ËùÒª±íÏÖµÄÊÇÔõôÑù¸üºÃµØ×éÖ¯¶ÔÏóÖ®¼äµÄÂß¼¹ØÏµ,
ÔõôÑù²ÅÄܸüºÃµØÀ©³äÏÖÓеĶ«Î÷¶ø²»ÐèÒª×÷ºÜ´óµÄ¸Ä¶¯, ¶ø²»½ö½öÊÇÀàµÄ¼Ì³Ð.
»¹ÓÐÒ»µãÐèҪ˵Ã÷µÄÊÇ, Éè¼ÆÄ£Ê½×ܵÄÔÔòÊÇÕë¶Ô½Ó¿Ú±à³Ì, ¶ø²»¹ØÐÄÆä¾ßÌå
ʵÏÖ, ÕâÑù´îÆðÀ´µÄÊÇÒ»¸ö¼Ü×Ó, »¹ÐèÒª×÷Ðí¶à¾ßÌåµÄ±à³Ì²ÅÄÜÕæÕýµÄÍê³Éϵͳ.
ÏÂÃæ, ÎÒÃǾͷֱð´ÓÉè¼ÆÄ£Ê½µÄÈýÖÖÀàÐÍÀ´¿´ Jive ʹÓÃÁËÆäÖеÄÄÄЩ.
Ò», ´´½¨ÐÍģʽ (Creational Patterns)
ÕâÒ»ÀàÐ͵ÄÉè¼ÆÄ£Ê½, ËùÒª±íÏÖµÄÊǶÔÏóµÄ´´½¨¹ý³Ì¼°ºÍÓû§ËùʹÓõĶÔÏóÖ®¼ä
µÄ¹ØÏµ.
1, Jive ÖÐÔÚ Forum Ö®ÉÏÓÖ¼ÓÁËÒ»²ã, ForumFactory, À´ÊµÏÖ¶Ô Forum µÄһЩ¿Ø
ÖÆ, ±ÈÈç´´½¨ÐµÄÌÖÂÛÇø, ɾ³ýÒ»¸öÌÖÂÛÇøµÈµÈ. Õâ¸öÀàʵ¼ÊÉÏÊÇÕû¸öϵͳµÄÈë¿Ú,
jsp ÖÐËù×öµÄÒ»Çж¼Òª´ÓµÃµ½Õâ¸öÀàµÄÒ»¸öʵÀý¿ªÊ¼. ËüµÄһЩ×ÓÀàºÍËüµÄ¹ØÏµÈç
ÏÂ:
|~~~~~~~~~~~~~~~~~|
| ForumFactory | abstract
|_________________|
| |
| extends |
| |
|~~~~~~~~~~~~~~~~~~~~| |~~~~~~~~~~~~~~~~~|
| ForumFactoryProxy | | DbForumFactory |
|____________________| |_________________|
(ͼ 3)
ÎÒÃÇÀ´¿´Ò»Ïµõ½Ò»¸ö ForumFactory ʵÀýµÄ¹ý³Ì:
FactoryForum factory = ForumFactory.getInstance(aAuthorization);
¾ÍµÃµ½ÁË ForumFactory µÄʵÀý, Õâ¸ö×îÖÕÓû§(skin Éè¼ÆÈËÔ±)ËùʹÓõÄÊÇËüµÄ×Ó
Àà ForumFactoryProxy µÄʵÀý, (ÆäÖÐÉæ¼°µ½ÁíÒ»¸öģʽ, ºóÃæ½«»áÌáµ½), µ«Êµ¼Ê
ÉÏÕæÕýÔÚ×öʵ¼Ê¹¤×÷µÄÊÇ DbForumFactory »òÕßÊÇÒ»¸öÖ¸¶¨µÄÀàµÄʵÀý, Ïà¹Ø´úÂëÈç
ÏÂ:
From ForumFactory.java
private static String className = "com.coolservlets.forum.database.DbFor
umFaactory";
// ϵͳȱʡµÄ ForumFactory µÄÒ»¸ö¾ßÌåµÄ×ÓÀà.
private static ForumFactory factory = null;
ForumFactory.getInstance()
String classNameProp = PropertyManager.getProperty("ForumFactory.classNa
me")
// ¿ÉÒÔͨ¹ýÅäÖÆÎļþÀ´Ñ¡ÔñÆäËûµÄ¾ßÌåµÄ×ÓÀà.
if (classNameProp != null) {
className = classNameProp;
}
try {
//Load the class and create an instance.
Class c = Class.forName(className);
factory = (ForumFactory)c.newInstance();
}
catch (Exception e) {
System.err.println("Failed to load ForumFactory class "
+ className + ". Jive cannot function normally.");
e.printStackTrace();
return null;
}
ËüʹÓõÄÊÇ Abstract Factory (³éÏ󹤳§)Éè¼ÆÄ£Ê½. ¸øÓû§Ò»¸öʹÓÃһϵÁÐÏà¹Ø
¶ÔÏó
µÄ½Ó¿Ú, ¶ø²»ÐèÒªÖ¸¶¨Æä¾ßÌåµÄÀà. Ò²¾ÍÊÇ˵, skin Éè¼ÆÈËԱдµÄ jsp Öв»Ó¦¸Ã³öÏÖ
new DbForumFactory Ö®ÀàµÄÓï¾ä. Jive ÖÐ AuthorizationFactory ҲʹÓÃÁËÕâ¸öÉè¼Æ
ģʽ
2, Jive ÖÐÓÐÒ»¸öºÜ²»´íµÄÏë·¨, ¾ÍÊǶÔÌù×ÓµÄÄÚÈݺͱêÌâ¿ÉÒÔ½øÐйýÂË, ±ÈÈç¹ýÂË
html
¹ýÂËһЩÔà»°, ¶Ô¸½¼ÓµÄ´úÂë½øÐиßÁÁÏÔʾ, ת»»Á´½ÓµÈµÈ. Èç¹ûÎÒҪʵÏÖÕâÑùµÄ¹¦ÄÜ
, ÓÐÓÐ
Òϼ¸ÖÖ·½·¨: (1) ÔÚ Message.getBody() getSubject() ÖнøÐпØÖÆ, (2) ÔÚ
Thread ÖеõÃ
µMessage ºó½øÐÐת»». »¹ÐèÒª¿¼ÂǵÄÎÊÌâÊÇÕâЩ¹ýÂ˵IJÙ×÷±ØÐëÄܹ»
ºÜ·½±ãµØÌí¼Óɾ³ý. ²»²»
͵ÄÄ¿±êËùÓõÄÉè¼Æ·½·¨ÊDz»Ò»ÑùµÄ, Jive ÊÇÕâÑù×öµÄ: ÒÔ°æ
ÃæÎªÖ÷, °ÑÕâЩ¹ýÂËÆ÷¿´×÷Êǰ°æÃ
æµÄÊôÐÔ, ¹ýÂËÆ÷Ö»¶ÔÆäËùÊôµÄ°æÃæÓÐЧ, ËùÒÔ Jiv
e ÖÐʹÓÃÁË (2), Õâ²¢²»ÊÇÖ÷ÒªµÄ, ÖØÒªÒª
µÊÇÕâЩ¹ýÂËÆ÷¸ÃÔõôÀ´×éÖ¯. ÎÒÃÇÏÈÀ´¿´
¿´ÐèÇó: Äܶ¯Ì¬Ìí¼Óɾ³ý, ¹¦ÄÜÀàËÆ, Ìù×ÓµÄÏÔʾʾ
ºÆä¾ßÌåÔõô´´½¨, ÈçºÎ±íÏÖÎÞ¹Ø
. ËÆºõÄ¿±êÖ»ÓÐÒ»¸ö -- Prototype(ÔÐÍ) Éè¼ÆÄ£Ê½. ¿´¿´
Jive µÄ¾ßÌåʵÏÖ.
|~~~~~~~~~~~~~~~~~~~~|
| ForumMessage |
|____________________|
|
| implements
|
|~~~~~~~~~~~~~~~~| Prototype |~~~~~~~~~~~~~~~~~~~~~|
| ForumThread |-----------> | ForumMessageFilter |
|----------------| |---------------------|
| getMessage() o | | clone() |
|______________|_| |_____________________|
| / |
|~~~~~~~~~~~~~~~~| |~~~~~~~~~~~~~~~| |~~~~~~~~~~~~~|
| aFilter.clone()| | HighlightCode | | HTML |
|________________| |---------------| |-------------| ......
| clone() o | | clone() o |
|___________|___| |___________|_|
| |
|~~~~~~~~~~~~~~~| |~~~~~~~~~~~~~~~|
| ·µ»ØÒ»¸öʵÀý | | ·µ»ØÒ»¸öʵÀý |
|_______________| |_______________|
(ͼ 4)
ÉÏͼ×÷ÁËÉÙÐíµÄ¼ò»¯. Jive ÓõÄʱºòÊǰÑÕâЩ¹ýÂËÆ÷´æÔÚÊý¾Ý¿âÖÐ, ¿ÉÒÔ¶¯Ì¬ÉèÖÃ
ÊôÐÔ, ±È½Ï·½±ã. À´¿´Ò»Ð©´úÂë:
From: DbForumThread.java
public ForumMessage getMessage(int messageID)
throws ForumMessageNotFoundException
{
ForumMessage message = factory.getMessage(messageID);
//Apply filters to message.
message = forum.applyFilters(message);
//ͨ¹ý Forum À´ÊµÏÖ, ÒòΪ Filter ÊÇ Forum µÄÊôÐÔ,
//Thread Ö»ÄÜͨ¹ý Forum µÄ½Ó¿ÚÀ´·ÃÎÊ.
return message;
}
From: DbForum.java
public ForumMessage applyFilters(ForumMessage message) {
for (int i=0; i < filters.length; i++) {
message = filters[i].clone(message);
}
//¿ÉÄÜ»áÓжà¸ö¹ýÂËÆ÷, ÒÀ´ÎÀ´²Ù×÷.
return message;
}
¶þ, ½á¹¹ÐÍģʽ (Structural Patterns)
ÕâÒ»ÀàµÄģʽ¹ØÐÄÀàºÍ¶ÔÏóÖ®¼äÔõô×éÖ¯ÆðÀ´ÐγɴóµÄ½á¹¹. Ö÷ҪʹÓü̳ÐÀ´
×éÖ¯½Ó¿Ú»òʵÏÖ.
1, ÎÒÃÇÔÙ½Ó×Å˼¿¼Ò»ÏÂ, Óû§Ö®¼äÓ¦¸ÃÓÐËùÇø±ð, ÓÐ Guest Óû§, ¿ÉÒÔÈÃËûÀ´¿´Ò»
¿´, µ«²»ÄÜ·¢Ìù×Ó, ÕýʽÓû§¿ÉÒÔ·¢Ìù×Ó, ²é¿´×Ô¼ºµÄ¸öÈËÐÅÏ¢, °æÃæ¹ÜÀíÕß(³ÆÖ®Îª
°æÖ÷)Ó¦¸Ã¿ÉÒÔ¿ØÖÆÌù×Ó, ±ÈÈç¼ÓÉÏÊʵ±µÄ±ê¼Ç, ÊÕÈ뾫»ªÇø, ÉõÖÁɾ³ýÌù×ӵȵÈ, ¶ø
ϵͳ¹ÜÀíÕßÓ¦¸Ã¾ßÓиü¸ßµÄȨÏÞ, ±ÈÈ翪ÐµİæÃæ, ɾ³ýÓû§µÈ²Ù×÷. ÔõôʵÏÖÕâ¸ö
¹¦ÄÜÄØ? ÎÒÃÇÖªµÀ, Jive ÖÐËùÓÐʵ¼ÊµÄ²Ù×÷¶¼ÊÇÓÉ database Ŀ¼ÏµÄÀàËùʵÏÖµÄ,
Èç¹û°ÑȨÏÞ¿ØÖƼӵ½Êý¾Ý¿âÕâÒ»²ãµÄ»°, ÕâÒ»²ã²»µ«Ó·Ö×, ¶øÇÒдºÃÒÔºó, Èç¹ûÒª¸Ä
µÄ»°, ÐèÒªÐ޸ĵĵط½ºÜ¶à, »¹ÈÝÒ׳ö´í, ËùÒÔ¿ÉÒÔÔÚÕâÒ»²ãÖ®ÉÏÔÙ¼ÓÒ»²ã, µ¥¶À½ø
ÐÐȨÏÞ¿ØÖÆ. ÕâÑù¾Í°Ñ "¸Ã²»¸Ã×ö" ºÍ "Ôõô×ö" ·Ö¸î¿ªÀ´, ÀûÓÚÒÔºóÐÞ¸Ä. ÆäʵÕâ
Ò²ÊÇÃæÏó¶ÔÏóµÄÒ»¸ö˼Ïë -- Ò»¸ö¶ÔÏó²»Òª¸ºµ£Ì«¶àµÄÔðÈÎ. ÕâÖÖ·½·¨ÔÚÉè¼ÆÄ£Ê½ÖÐ
³ÆÎª Proxy (´úÀí) ģʽ. ºÃ±ÈÉú²ú³§¼ÒºÍ´úÀíÉ̵ĹØÏµ. (µ±È», ÔÚ Jive ÖÐÕâ¸ö±È
Ó÷²»Ì«ºÏÊÊ). Proxy µÄÄ¿µÄ¾ÍÊǸøÁíÒ»¸ö¶ÔÏóÌṩһ¸ö´úÀíÀ´¿ØÖƶÔËüµÄ·ÃÎÊ.
Proxy ģʽһֱ¹á´© Jive µÄʼÖÕ, ¼¸ºõËùÉæ¼°µ½µÄ¶ÔÏó¶¼ÐèÒª. Æä½á¹¹Èçͼ 2
Ëùʾ.
´ÓÇ°ÃæÒѾ֪µÀ, ForumFactory ÊÇÕû¸öϵͳµÄ¿ªÊ¼. ÔÙÀ´¿´¿´ ForumFactory
µÄ´úÂë:
From ForumFactory.java
ForumFactory.getInstance() µÄ×îºó:
ForumFactoryProxy proxy = new ForumFactoryProxy(
factory,
authorization,
factory.getPermissions(authorization)
);
return proxy;
Ç°ÃæµÃµ½µÄ factory ÊÇ DbForumFactory µÄʵÀý, ÕâÀï°ÑÕâ¸öʵÀýÓÖÓÃ
ForumFactoryProxy ·â×°ÆðÀ´. ×îºó·µ»ØÒ»¸ö ForumFactoryProxy µÄʵÀý. Ò²¾ÍÊÇ
˵ jsp skin µÄÉè¼ÆÕßËùÓÃµÄ ForumFactory ʵ¼ÊÉÏÊÇ ForumFactoryProxy. ½Ó×Å¿´
¿´ ForumFactoryProxy Àï·¢ÉúÁËʲôÊÂ, ÄÇÒ»¸öСƬ¶Î×öÀý×Ó:
Æä¹¹Ô캯ÊýÖÐµÄ Factory ¾ÍÊÇÒ»¸ö DbForumFactory µÄʵÀý, ÓÉËüÀ´×ö¾ßÌåµÄ
¹¤×÷. Authorization ¿ÉÒÔÈÏΪÊÇÒ»¸öÈÏÖ¤¹ýµÄµ±Ç°Óû§(ָʵ¼ÊµÄä¯ÀÀÆ÷µÄʹÓÃÕß),
ForumPermissions ¿ÉÒÔÈÏΪÊǵ±Ç°Óû§µÄȨÏÞ.
public Forum createForum(String name, String description)
throws UnauthorizedException
{
//ÕâÀï¾Í¶ÔȨÏÞ½øÐÐÁ˼ì²é, ¾ßÓÐϵͳ¹ÜÀíԱȨÏÞ, Ôò¿ÉÒÔ½øÐÐÏàÓ¦µÄ²Ù×÷,
//·ñÔòÅ׳öÒì³£.
if (permissions.get(ForumPermissions.SYSTEM_ADMIN)) {
Forum newForum = factory.createForum(name, description);
return new ForumProxy(newForum, authorization, permissions);
}
else {
throw new UnauthorizedException();
}
}
public Forum getForum(int ID) throws ForumNotFoundException,
UnauthorizedException
{
Forum forum = factory.getForum(ID);
ForumPermissions forumPermissions = forum.getPermissions(authorizati
on);
//Create a new permissions object with the combination of the
//permissions of this object and tempPermissions.
ForumPermissions newPermissions =
new ForumPermissions(permissions, forumPermissions);
//Check and see if the user has READ permissions. If not, throw an
//an UnauthorizedException.
if (!(
newPermissions.get(ForumPermissions.READ) ||
newPermissions.get(ForumPermissions.FORUM_ADMIN) ||
newPermissions.get(ForumPermissions.SYSTEM_ADMIN)
))
{
throw new UnauthorizedException();
}
// ͬÉÏËùÊö.
// ÕâÀïµÃµ½µÄ forum, ÊÇÒ»¸ö DbForum µÄʵÀý, ¸ú ForumFactory Ò»Ñù,
// ·µ»ØÒ»¸ö·â×°¹ýµÄ´úÀí¶ÔÏó, À´¶Ô forum ½øÐÐȨÏÞ¿ØÖÆ.
return new ForumProxy(forum, authorization, newPermissions);
}
ÆäËûËùÓеĶÔÏó¶¼ÊÇÀàËÆµÄ. ÕâÀï¾Í²»ÔÙ׸Êö.
Èý, ÐÐΪÐÍģʽ (Behavioral Patterns)
ÕâÒ»ÀàµÄģʽ¹ØÐĵÄÊÇËã·¨ÒÔ¼°¶ÔÏóÖ®¼äµÄÈÎÎñ·ÖÅä. ËüËùÃèÊöµÄ²»½ö½öÊǶÔÏó»ò
Àà
µÄÉè¼ÆÄ£Ê½, »¹ÓÐËüÃÇÖ®¼äµÄͨѶģʽ.
1, ÏÂÀ´¿´¿´Ôõô´ÓÒ»¸ö Forum Öеõ½Ò»Ð© Thread. µ±È»ÕâÀï񻃾¼°µ½Êý¾Ý¿â, ÎÒÃÇ
ÏÈÉè¼ÆÒ»¸ö×î¼òµ¥µÄÊý¾Ý¿â±í, ±íÃû: thread, ×Ö¶Î ThreadID int, ForumID int, Æä
ËûÄÚÈÝÎÒÃDz»¹ØÐÄ. È»ºó±ÈÈç Forum ÖеÄÒ»¸ö·½·¨, getThreads() À´·µ»Øµ±Ç° Forum
ËùÓÐµÄ Thread. È»ºó¾Í¿ÉÒÔÕâÑù×ö:
public ForumThread[] getThreads()
{
1, ´ÓÊý¾Ý¿âÀïÃæ²éѯ, È¡³öËùÓÐµÄ ThreadID,
2, ¸ù¾Ý ThreadID ¹¹Ôì ForumThread ¶ÔÏó,
3, ·µ»ØÒ»¸öÊý×é.
}
ÕâÑù×ö×îÊ¡ÊÂ, ×î¼òµ¥ÁË, µ«ºÃ²»ºÃÄØ? »¹µÃ¿´ÐèÇó, ±ÈÈçÎÒÒªÇó¸ù¾Ýʱ¼äÅÅÐò,
¾Í»¹µÃÐÞ¸ÄÕâ¸ö·½·¨, Ò²¾ÍÊÇ˵ÐèÒªÐÞ¸Ä DbForum ¶ÔÏó. ÄÇΪʲô²»°ÑÈ¡ Thread Õâ¸ö
²Ù×÷µ¥¶ÀÄóöÀ´ÄØ? ÕâÑùµÄºÃ´¦¾ÍÊǹ¦ÄܶÀÁ¢»¯, ʹ DbForum ¸ü¼òµ¥, ·ûºÏÇ°ÃæÎÒÃÇËù
Ìáµ½µÄ²»ÒªÈöÔÏ󸺵£Ì«¶àµÄÔðÈÎÕâ¸öÔÔò. Ò²ÐíÄã»á˵, Èç¹ûÒªÐ޸ĵϰ, ²»ÊǶ¼µÃ
ÐÞ¸ÄÂð? ·ÅÄÄÀïÊÇÒ»ÑùµÄ, ÕâÑùû´í, µ«Ö»ÏÞÓÚºÜСµÄϵͳ, Èç¹ûϵͳһ´ó, ÄÇô¾Í¿É
ÄÜ×ö DbForum Öеļòµ¥²éѯºÍһЩ±È½Ï¸´ÔӵIJéѯµÄ³ÌÐòÔ±¾Í²»ÊÇÒ»¸öÈË, ÕâÑùÇ£³¶µ½
ÐèÒª¸Ä¶¯µÄµØ·½½Ï¶à, µ«·ÖÀëÒÔºó, Ö»ÐèÒªÒ»¸öÈ˸ĺÜÉٵĵط½¾Í¿ÉÒÔÍê³É. »Ø¹ýÍ·À´
ÔÙ¿´¿´ÎÊÌâ, ÕâÀïÒª·µ»ØÒ»Èº ForumThread ¶ÔÏó, ¶øÇÒËüÃÇÖ®¼ä»¹¿ÉÄÜÓÐÒ»¶¨µÄÏȺó¹Ø
ϵ, ÔõôÀ´×öÕâ¸ö¹¤×÷ÄØ? Iterator Éè¼ÆÄ£Ê½ÊÇÒ»¸öºÏÊʵÄÑ¡Ôñ. Iterator ģʽÌṩ
ÁËÒ»¸öÁ¬Ðø·ÃÎÊÒ»´óȺ¶ÔÏóµÄ·½·¨, ¶ø²»ÐèÒªÖªµÀËüÃǵıíÏÖÐÎʽ, ±ÈÈ簴ʲô·½Ê½ÅÅ
ÐòµÈµÈ.
ºÃÁË, À´¿´¿´ Jive µÄ¾ßÌåʵÏÖ. ÓÉÓÚ Java ±¾ÉíÒѾÓÐÕâÑùµÄ½Ó¿Ú, Iterator ½Ó
¿Ú, ËùÒÔֻҪʵÏÖÕâ¸ö½Ó¿Ú¾Í¿ÉÒÔÁË.
From DbForum:
public Iterator threads() {
return new DbForumIterator(this, factory);
}
From DbForumIterator: (×öÁ˸͝)
public class DbForumIterator implements Iterator {
public DbForumIterator(...)
{
...
}
public boolean hasNext() //ÊÇ·ñ»¹ÓÐÔªËØ
{
...
}
public Object next() // µÃµ½ÏÂÒ»¸öÔªËØ
{
...
}
...
}
ÄÇô jsp ÖпÉÒÔÕâÑù·ÃÎÊ:
Iterator threads = aForum.threads();
while (threads.hasNext())
{
ForumThread thread = (ForumThread)threads.next();
×öһЩ²Ù×÷.
}
´ÓÖпÉÒÔ¿´³ö, ͨ¹ýʹÓà Iterator °Ñ Threads µÄһЩ¾ßÌåϸ½Ú½øÐÐÁË·â
×°, ÌṩͳһµÄ½Ó¿Ú. Jive ÖÐÕâ¸öÉè¼ÆÄ£Ê½Ò²ÊÇÓõķdz£¶à, ¶à¸öÓû§ÏÔʾ,
¶à¸ö°æÃæÏÔʾ, ¶à¸öÏßË÷, ¶à¸öÌù×Ó¶¼ÐèÒªÓÉËüÀ´ÊµÏÖ.
С½á:
ÉÏÃæÎÒÃÇÒ»Æð̽ÌÖÁËÒ»ÏÂÉè¼ÆÄ£Ê½ÔÚ Jive ÖеÄÓ¦ÓÃÇé¿ö, µ±È»Ö»ÊǺܼòµ¥, ºÜ
·ôdz, Ò²ºÜÆ¬Ãæ, ²»¹ý×ÜËãÄܶÔÉè¼ÆÄ£Ê½ÓÐЩÈÏʶ. ʵ¼ÊÉÏ, Éè¼ÆÄ£Ê½¾ÍÊÇÎüÊÕÐí¶àǰ
È˵ľÑé, °ÑÉè¼ÆÖÐÒ»Ð©ÖØÒªµÄºÍÖØ¸´³öÏÖµÄһЩģʽ×ܽáÆðÀ´, ¸ø³öÒ»¸öϵͳµÄÃüÃû
,
¸ø³öÏàÓ¦µÄ½âÊÍºÍÆÀ¼Û, Õâ¸ö¹¤×÷×îÏÈÓÉ 4 λÈí¼þ´óʦËù×ö, ËûÃǺÏдÁËÒ»±¾Êé --
Design Pattern: Elements of Reusable Object-Oriented Software, ºóÀ´, ÈËÃǰÑ
ËûÃdzÆÎª GoF (Gang Of Four).
¶ÔÓÚÉè¼ÆÄ£Ê½, ¿ÉÄÜÔÚÎÒÃǵÄʵ¼ÊÏîÄ¿ÖÐ×Ô¾õ²»×Ô¾õµØÔÚʹÓÃ×Å, ±ÈÈç Factory
Method ģʽ, Abstract ģʽ, Singleton ģʽ, Iterator ģʽ, µÈµÈ, Ö»ÊǸÅÄî²»ÊÇ
·Ç
³µÄÃ÷È·, Éè¼Æ¿ÉÄÜ»¹Óв»Ì«ºÏÀíµÄµØ·½, ´¦ÓÚÒ»ÖÖ¸úןоõ×ßµÄ״̬, ÏàÐźܶàÓÐ
¾Ñé
µÄÉè¼ÆÕß, ÔÀ´Ã»ÓнӴ¥Éè¼ÆÄ£Ê½, Ò»µ©½Ó´¥ÒÔºó, »áÓÐÒ»ÖÖ»ÐÈ»´óÎòµÄÏë·¨, ¹þ, Ô
À´ÊÇÕâô»ØÊÂ. ѧϰÉè¼ÆÄ£Ê½, ÄܺܺõذïÖúÎÒÃÇÉè¼Æ, ÔÚÏàͬµÄÎÊÌâ, ÏàͬµÄ±³¾°ÏÂ
,
¿ÉÒÔÖ±½ÓʹÓÃËü, ÓеÄʱºò²»ÖªµÀ¸ÃÑ¡ÔñÄÄÖÖºÃ, ¾ÍÐè¶ÔÎÊÌâ½øÐиüÉîÒ»²ãµÄ·ÖÎö, ½ø
ÐÐ
×ÛºÏȨºâ, ¶ÔÉè¼ÆÄ£Ê½Ò²Òª½øÐиüÉî¿ÌµÄÀí½â, ²ÅÄܵõ½ºÃµÄ½á¹û, ÕâÒ²ÊÇÒ»¸ö½ø²½µÄ
¹ý³Ì.
¶ÔÓÚ±ÊÕßÀ´Ëµ, ¸Õ¸Õ½Ó´¥Éè¼ÆÄ£Ê½, ÓÐÁËÒ»µã´ÖdzµÄÀí½â, ¾ÍðÃÁдÁËÕâÆªËãÊÇÒ»
µãÐĵõĶ«Î÷, Ò²ÊǶÔ×Ô¼ºµÄÌôÕ½, Öм䷸µÄһЩ´íÎó, »¹ÇëÖ¸Õý, лл.
²Î¿¼ÎÄÏ×:
1, Design Pattern: Elements of Reusable Object-Oriented Software,
2, Jive Ô´´úÂë
--
¼ÇµÃµ½ program ¹àË®°¡!
¡ù À´Ô´:¡¤ÌýÌÎÕ¾ tingtao.dhs.org¡¤[FROM: ÄäÃûÌìʹµÄ¼Ò]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
Ò³ÃæÖ´ÐÐʱ¼ä£º2.471ºÁÃë