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ºÁÃë