• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 8, 文章 - 0, 評(píng)論 - 17, 引用 - 0
            數(shù)據(jù)加載中……

            觀察者模式(Subject/Observer)

            定義:對(duì)象間的一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。 

            功能:搜索數(shù)據(jù)庫(kù),當(dāng)有需要公布的數(shù)據(jù)將其用各種方式發(fā)送出去。
             
            觀察者模式無(wú)疑能很好的做到上面的要求,無(wú)論要多少種方式,只要增加多個(gè)繼承之ITransfer接口的派生類即可,有很好的維護(hù)性。

            以下是實(shí)際的應(yīng)用.



            //接口
            //ITransfer.h
            #pragma once

            class ITransfer
            {
            public:
                
            virtual bool DoTransfer(...= 0;
            }
            ;


            //FetionTransfer.h
            #pragma once
               #include "Transfer.h"
            class CFetionTransfer:public ITransfer
            {
            public:
                CFetionTransfer();
                
            ~CFetionTransfer();
                
            bool DoTransfer(...);
            private:
                ......
            }
            ;


            //MailTransfer.h
            #pragma once
               #include "Transfer.h"
            class CMailTransfer: public ITransfer
            {
            public:
                CMailTransfer();
                
             ~CMailTransfer();
                
            bool DoTransfer(...);
            private:
            ....
            }
            ;


            //TransferPool.h
            #pragma once

            #include 
            "Transfer.h"
            #include 
            <vector>
            using namespace std;

            class CTransferPool
            {
            private:
                vector
            <ITransfer*> vo;
            public:
                
            virtual ~CTransferPool();

                
            void Login(ITransfer* po);

                
            void Logout(ITransfer* po);
               
            //向各成員廣播消息
                void Notify(...);
            }
            ;

            //TransferPool.cpp
            #include "TransferPool.h"

            CTransferPool::
            ~CTransferPool()
            {
                vector
            <ITransfer*>::iterator vi = vo.begin();
                
            for (; vi != vo.end(); vi++)
                
            {
                             if(*vi)
                                {
                                    delete *vi;
                                     *vi = NULL;
                                }

                }

            }


            void CTransferPool::Login(ITransfer* po)
            {
                vo.push_back(po);
            }


            void CTransferPool::Logout(ITransfer* po)
            {
                vector
            <ITransfer*>::iterator vi = vo.begin();
                
            for (; vi != vo.end(); vi++)
                
            {
                    
            if (*vi == po)
                        vo.erase(vi);
                }

            }


            void CTransferPool::Notify(...)
            {
                vector
            <ITransfer*>::iterator vi = vo.begin();
                
            for (; vi != vo.end(); vi++)
                
            {
                    ITransfer 
            *= *vi;
                        
                    (
            *vi)->DoTransfer(...);
                }

            }


            void main
            {
                CTransferPool
            *m_pTranPool= new CTransferPool();
                
                CFetionTransfer 
            *m_pFetionTran = new CFetionTransfer(...);
                CMailTransfer 
            *m_pMailTran = new CMailTransfer(...);

                m_pTranPool
            ->Login(m_pFetionTran);
                m_pTranPool
            ->Login(m_pMailTran);
                   
                    
            while(需要發(fā)送消息)
                    
            {
                        m_pTranPool
            ->Notify();
                    }


                    
            //釋放
                      if(m_pTranPool)
                    
            {
                        delete m_pTranPool;
                        m_pTranPool 
            = NULL;
                    }


            }

            posted on 2008-08-29 15:49 YG 閱讀(1812) 評(píng)論(5)  編輯 收藏 引用 所屬分類: C/C++ & 設(shè)計(jì)模型

            評(píng)論

            # re: 觀察者模式(Subject/Observer)   回復(fù)  更多評(píng)論   

            恩,受益匪淺,謝謝
            2008-08-29 18:46 | 鄒從杰

            # re: 觀察者模式(Subject/Observer)   回復(fù)  更多評(píng)論   

            比《設(shè)計(jì)模式》上的例子容易理解些。
            附上觀察者模式的定義:
            定義對(duì)象間的一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。
            2008-08-29 19:09 | ronliu

            # re: 觀察者模式(Subject/Observer)   回復(fù)  更多評(píng)論   

            唉,還是很麻煩很麻煩。。。。
            2008-08-29 21:26 | 空明流轉(zhuǎn)

            # re: 觀察者模式(Subject/Observer)   回復(fù)  更多評(píng)論   

            不錯(cuò)....
            2008-08-30 15:25 | ci

            # re: 觀察者模式(Subject/Observer)   回復(fù)  更多評(píng)論   

            呵呵,以前做項(xiàng)目時(shí)用過(guò)這種模式,只是當(dāng)時(shí)并不知道這就是觀察著模式,正可是“不知廬山真面目,只緣身在此山中”
            2009-02-04 09:35 | nirvana
            久久精品无码专区免费青青| 9久久9久久精品| 无码国内精品久久综合88| 怡红院日本一道日本久久 | 狠狠色噜噜狠狠狠狠狠色综合久久| 色欲综合久久中文字幕网| 情人伊人久久综合亚洲| 亚洲伊人久久成综合人影院| 久久国产精品77777| 一97日本道伊人久久综合影院| 久久久久久毛片免费播放| 色婷婷久久久SWAG精品| 久久精品国产91久久综合麻豆自制| 一本大道久久东京热无码AV| 94久久国产乱子伦精品免费| 欧洲成人午夜精品无码区久久| 精品多毛少妇人妻AV免费久久| 新狼窝色AV性久久久久久| 亚洲国产精品无码久久久久久曰| 久久精品国产半推半就| 亚洲中文字幕无码久久精品1 | 性高湖久久久久久久久AAAAA| 国产精品99久久久久久人| 伊人久久大香线蕉综合Av| 久久亚洲高清综合| 狠狠人妻久久久久久综合| 久久综合久久综合久久| 97精品伊人久久大香线蕉app| 色综合久久久久久久久五月| 伊人久久大香线蕉av不卡| 一级女性全黄久久生活片免费| 久久久久香蕉视频| 久久国产精品免费一区| 久久久久久久亚洲精品| 久久se精品一区精品二区国产| 精品久久久久一区二区三区 | 亚洲级αV无码毛片久久精品| 蜜桃麻豆WWW久久囤产精品| 久久久久se色偷偷亚洲精品av | 日韩久久久久中文字幕人妻| 四虎国产精品成人免费久久|