• <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>

            wenglj

            面向對象技術

            常用鏈接

            統計

            最新評論

            觀察者模式實現---偵聽器模式

            ??????根據四人幫解釋,觀察者模式解決當某些其他對象改變狀態時,如果一組對象要進行更新,那么將這兩個對象分別封裝在兩個獨立的對象中。
            ??????個人理解,在觀察者模式中,最重要的要理解哪個對象是主動的,也就是事件源,那么觀察者模式就很簡單了。
            ??????以下是我實現偵聽器模式,可以生成廣播信息。
            ??????代碼如下:

            ??????頭文件如下:
            /*! @file?? Liserner.h??
            \brief
            ?文件功能:?????? 偵聽器模式???????????????????????????????????? <br>
            ????????????????????????????????????????????????????? <br>
            ?文件名稱:?? Liserner.h???????????????????????????????????????????????????????? <br>
            ?模塊名? :?????????????????????????????????????????????????????? <br>
            \author????????? wenglj
            \version????? 1.0.1
            \remark??????????????????????????????????????????????????????????????????????? <br>
            修改記錄 :? <br>?
            日 期 &nbsp;&nbsp;&nbsp;&nbsp;版本&nbsp;&nbsp;&nbsp;&nbsp;修改人&nbsp;&nbsp;&nbsp;&nbsp;修改內容<br>
            YYYY/MM/DD?? &nbsp; 1.0.0? &nbsp;? <XXX> &nbsp;? 創建? <br>
            ******************************************************************************** <br>
            版權:浙江傲雪工作室????? 保留所有權利
            *******************************************************************************/
            #pragma once

            #include <vector>
            using?std::vector;


            /*! @class? abstract Event
            ********************************************************************************
            \brief?
            功能???? :???? 事件<br>
            類名稱?? :??? abstract Event?
            \exception??
            \author???wenglj
            \date???? 2006-9-23
            \remark??? <br>
            典型用法 :???
            ******************************************************************************/
            class Event
            {
            public:
            ?enum?
            ?{
            ??ADD,
            ??DEL
            ?}TYPE;
            ?//?
            ?/*! @function? public pure virtual? OnAdd
            ?********************************************************************************
            ?\brief?
            ?功能??? :???????? 添加對象事件<br>
            ?函數名? :???? OnAdd
            ?\return void <insert return value description here>
            ?\exception?
            ?\author????? wenglj
            ?\remark??? <br>
            ?典型用法:?? <br>
            ?復雜度 :????????????????????????
            ?*******************************************************************************/
            ?virtual?void?OnAdd( void ) = 0;
            ?//
            ?/*! @function? public pure virtual? OnDel
            ?********************************************************************************
            ?\brief?
            ?功能??? :???對象刪除事件<br>
            ?函數名? :???OnDel
            ?\return void <insert return value description here>
            ?\exception?
            ?\author????wenglj
            ?\remark??? <br>
            ?典型用法:?? <br>
            ?復雜度 :????????????????????????
            ?*******************************************************************************/
            ?virtual?void?OnDel( void ) = 0;
            };?//?Event

            /*! @class? CDictograph
            ********************************************************************************
            \brief?
            功能???? :???? 偵聽器,事件源<br>
            類名稱?? :??? CDictograph?
            \exception??
            \author???wenglj
            \date???? 2006-9-23
            \remark??? <br>
            典型用法 :???
            ******************************************************************************/
            class CDictograph
            {

            public:
            ?CDictograph(){};
            ?~CDictograph(){};

            public:
            ?typedef?vector<Event*>?Liseners;
            ?typedef?vector<Event*>::iterator?LisenersIteraor;

            ?/*! @function? public? AddLisener
            ?********************************************************************************
            ?\brief?
            ?功能??? :??????? 添加偵聽對象<br>
            ?函數名? :???AddLisener
            ?@param? pLisener Event *? < 偵聽對象 >
            ?\return void <insert return value description here>
            ?\exception?
            ?\author????wenglj
            ?\remark??? <br>
            ?典型用法:?? <br>
            ?復雜度 :????????????????????????
            ?*******************************************************************************/
            ?void?AddLisener( Event* pLisener );
            ?/*! @function? public? DelLisener
            ?********************************************************************************
            ?\brief?
            ?功能??? :????? 刪除偵聽對象<br>
            ?函數名? :??DelLisener
            ?@param? pLisener Event *? < 偵聽對象 >
            ?\return void <insert return value description here>
            ?\exception?
            ?\author???wenglj
            ?\remark??? <br>
            ?典型用法:?? <br>
            ?復雜度 :????????????????????????
            ?*******************************************************************************/
            ?void?DelLisener( Event* pLisener );

            ?/*! @function? public? ToNotify
            ?********************************************************************************
            ?\brief?
            ?功能??? :???? 通知偵聽對象事件發生<br>
            ?函數名? :??? ToNotify
            ?@param? nCode int?? < 事件類型 >
            ?\return void <insert return value description here>
            ?\exception?
            ?\author???wenglj
            ?\remark??? <br>
            ?典型用法:?? <br>
            ?復雜度 :????????????????????????
            ?*******************************************************************************/
            ?void?ToNotify( int nCode );

            ?
            protected :
            ?//?偵聽對象集合
            ?Liseners?m_vtLiseners;
            };?//?CDictograph

            /*! @class? CLisener
            ********************************************************************************
            \brief?
            功能???? :???? 偵聽實體, 事件的接受者<br>
            類名稱?? :??? CLisener?
            \exception??
            \author???wenglj
            \date???? 2006-9-23
            \remark??? <br>
            典型用法 :???
            ******************************************************************************/
            class CLisener :?public?Event
            {
            public:
            ?CLisener(void);
            ?~CLisener(void);

            public :
            ?//?
            ?/*! @function? public virtual? OnAdd
            ?********************************************************************************
            ?\brief?
            ?功能??? :??????????? 添加事件響應???????????? <br>
            ?函數名? :
            ?\return void <insert return value description here>
            ?\exception?
            ?\author?????wenglj
            ?\remark??? <br>
            ?典型用法:?? <br>
            ?復雜度 :????????????????????????
            ?*******************************************************************************/
            ?virtual?void?OnAdd( void );
            ?//
            ?/*! @function? public virtual? OnDel
            ?********************************************************************************
            ?\brief?
            ?功能??? :??????? 刪除事件響應<br>
            ?函數名? :
            ?\return void <insert return value description here>
            ?\exception?
            ?\author????wenglj
            ?\remark??? <br>
            ?典型用法:?? <br>
            ?復雜度 :????????????????????????
            ?*******************************************************************************/
            ?virtual?void?OnDel( void );
            ?
            };?//CLiserner


            /*! @class? CClient
            ********************************************************************************
            \brief?
            功能???? :???? 客戶對象, 觸發事件<br>
            類名稱?? :??? CClient?
            \exception??
            \author???wenglj
            \date???? 2006-9-23
            \remark??? <br>
            典型用法 :???
            ******************************************************************************/
            class?CClient
            {
            public :
            ?typedef?vector<int>??Objects;
            ?typedef?vector<int>::iterator?ObjectsIterator;

            ?CClient();
            ?~CClient();

            public :
            ?/*! @function? public? AddObject
            ?********************************************************************************
            ?\brief?
            ?功能??? :?????? 添加事件觸發????????????????? <br>
            ?函數名? :
            ?@param? i int?? < insert parameter description here>
            ?\return void <insert return value description here>
            ?\exception?
            ?\author???wenglj
            ?\remark??? <br>
            ?典型用法:?? <br>
            ?復雜度 :????????????????????????
            ?*******************************************************************************/
            ?void?AddObject( int i );


            ?/*! @function? public? DelObject
            ?********************************************************************************
            ?\brief?
            ?功能??? :????????? 刪除事件觸發?????????????? <br>
            ?函數名? :
            ?@param? i int?? < insert parameter description here>
            ?\return void <insert return value description here>
            ?\exception?
            ?\author????wenglj
            ?\remark??? <br>
            ?典型用法:?? <br>
            ?復雜度 :????????????????????????
            ?*******************************************************************************/
            ?void?DelObject( int i );

            ?/*! @function? public? SetLiseners
            ?********************************************************************************
            ?\brief?
            ?功能??? :???? 設置偵聽器??????????????????? <br>
            ?函數名? :
            ?@param? pObject CDictograph *? < insert parameter description here>
            ?\return void <insert return value description here>
            ?\exception?
            ?\author???wenglj
            ?\remark??? <br>
            ?典型用法:?? <br>
            ?復雜度 :????????????????????????
            ?*******************************************************************************/
            ?void?SetLiseners( CDictograph* pObject );

            protected :

            ?Objects?m_vtObjects;

            ?CDictograph*?m_pDictograph;
            };?//?CClient



            實現文件如下:


            /*! @file?? Liserner.cpp??
            \brief
            ?文件功能:??????? 偵聽器模式實現??????????????????????????????????? <br>
            ????????????????????????????????????????????????????? <br>
            ?文件名稱:?? Liserner.cpp???????????????????????????????????????????????????????? <br>
            ?模塊名? :?????????????????????????????????????????????????????? <br>
            \author????wenglj
            \version?????
            \remark??????????????????????????????????????????????????????????????????????? <br>
            修改記錄 :? <br>?
            日 期 &nbsp;&nbsp;&nbsp;&nbsp;版本&nbsp;&nbsp;&nbsp;&nbsp;修改人&nbsp;&nbsp;&nbsp;&nbsp;修改內容<br>
            YYYY/MM/DD?? &nbsp; 1.0.0? &nbsp;? <XXX> &nbsp;? 創建? <br>
            ******************************************************************************** <br>
            版權:浙江傲雪工作室????? 保留所有權利
            *******************************************************************************/
            #include "StdAfx.h"
            #include ".\liserner.h"

            #include <algorithm>


            /*! @function? public? AddLisener
            ********************************************************************************
            \brief?
            功能??? :?????? 添加偵聽對象????????????????? <br>
            函數名? :
            @param? pLisener Event *? < insert parameter description here>
            \return void <insert return value description here>
            \exception?
            \author???wenglj
            \remark??? <br>
            典型用法:?? <br>
            復雜度 :????????????????????????
            *******************************************************************************/
            void?CDictograph::AddLisener( Event* pLisener )
            {
            ?m_vtLiseners.push_back( pLisener );
            ?std::cout<<"Add Lisener Object"<<std::endl;
            }

            /*! @function? public? DelLisener
            ********************************************************************************
            \brief?
            功能??? :??????? 刪除偵聽對象??????????????? <br>
            函數名? :
            @param? pLisener Event *? < insert parameter description here>
            \return void <insert return value description here>
            \exception?
            \author???wenglj
            \remark??? <br>
            典型用法:?? <br>
            復雜度 :????????????????????????
            *******************************************************************************/
            void?CDictograph::DelLisener( Event* pLisener )
            {
            ?LisenersIteraor?it;
            ?it?=?std::find( m_vtLiseners.begin(), m_vtLiseners.end(), pLisener );

            ?if ( it != m_vtLiseners.end() )
            ??m_vtLiseners.erase( it );

            ?std::cout<<"Delete Lisener Object"<<std::endl;
            }

            /*! @function? public? ToNotify
            ********************************************************************************
            \brief?
            功能??? :????? 通知偵聽對象?????????????????? <br>
            函數名? :
            @param? nCode int?? < insert parameter description here>
            \return void <insert return value description here>
            \exception?
            \author???wenglj
            \remark??? <br>
            典型用法:?? <br>
            復雜度 :????????????????????????
            *******************************************************************************/
            void?CDictograph::ToNotify( int nCode )
            {
            ?std::cout<<"ToNotify Event"<<std::endl;
            ?for( LisenersIteraor it = m_vtLiseners.begin(); it != m_vtLiseners.end(); ++it )
            ?{
            ??Event*?p?=?*it;
            ??switch( nCode )
            ??{
            ??case Event::ADD:
            ???p->OnAdd();
            ???break;
            ??case Event::DEL:
            ???p->OnDel();
            ???break;
            ??default:
            ???break;
            ??}
            ??
            ?}
            }

            CLisener::CLisener(void)
            {
            }

            CLisener::~CLisener(void)
            {
            }

            /*! @function? public virtual? OnAdd
            ********************************************************************************
            \brief?
            功能??? :???? 添加事件響應??????????????????? <br>
            函數名? :
            \return void <insert return value description here>
            \exception?
            \author??wenglj
            \remark??? <br>
            典型用法:?? <br>
            復雜度 :????????????????????????
            *******************************************************************************/
            void?CLisener::OnAdd()
            {
            ?std::cout<<"Add Object Event "<<std::endl;
            }

            /*! @function? public virtual? OnDel
            ********************************************************************************
            \brief?
            功能??? :?????? 刪除事件響應????????????????? <br>
            函數名? :
            \return void <insert return value description here>
            \exception?
            \author???wenglj
            \remark??? <br>
            典型用法:?? <br>
            復雜度 :????????????????????????
            *******************************************************************************/
            void?CLisener::OnDel()
            {
            ?std::cout<<"Del Object Event"<<std::endl;
            }

            CClient::CClient()
            :?m_pDictograph( NULL )
            {
            }

            CClient::~CClient()
            {
            }

            /*! @function? public? AddObject
            ********************************************************************************
            \brief?
            功能??? :??? 觸發添加事件???????????????????? <br>
            函數名? :
            @param? i int?? < insert parameter description here>
            \return void <insert return value description here>
            \exception?
            \author??? wenglj
            \remark??? <br>
            典型用法:?? <br>
            復雜度 :????????????????????????
            *******************************************************************************/
            void?CClient::AddObject( int i )
            {
            ?m_vtObjects.push_back( i );
            ?std::cout<<"CClient Object AddObject"<<std::endl;
            ?m_pDictograph->ToNotify( Event::ADD );
            ?
            }

            /*! @function? public? DelObject
            ********************************************************************************
            \brief?
            功能??? :????? 觸發刪除事件?????????????????? <br>
            函數名? :
            @param? i int?? < insert parameter description here>
            \return void <insert return value description here>
            \exception?
            \author???wenglj
            \remark??? <br>
            典型用法:?? <br>
            復雜度 :????????????????????????
            *******************************************************************************/
            void?CClient::DelObject( int i )
            {
            ?ObjectsIterator?it;
            ?it?=?std::find( m_vtObjects.begin(), m_vtObjects.end(), i );
            ?if ( it != m_vtObjects.end() )
            ?{
            ??m_vtObjects.erase( it );
            ??std::cout<<"CClient Object DelObject"<<std::endl;
            ??m_pDictograph->ToNotify( Event::DEL );
            ??
            ?}
            }

            /*! @function? public? SetLiseners
            ********************************************************************************
            \brief?
            功能??? :?????? 設置偵聽器對象????????????????? <br>
            函數名? :
            @param? pObject CDictograph *? < insert parameter description here>
            \return void <insert return value description here>
            \exception?
            \author???wenglj
            \remark??? <br>
            典型用法:?? <br>
            復雜度 :????????????????????????
            *******************************************************************************/
            void?CClient::SetLiseners( CDictograph* pObject )
            {
            ?m_pDictograph?=?pObject;
            }


            主程序如下:
            ???// DictaphonePattern.cpp : 定義控制臺應用程序的入口點。
            //

            #include "stdafx.h"

            #include "Liserner.h"

            /*! @function? global? _tmain
            ********************************************************************************
            \brief?
            功能??? :??? 主程序???????????????????? <br>
            函數名? :
            @param? argc int?? < insert parameter description here>
            @param? argv _TCHAR *[]? < insert parameter description here>
            \return int <insert return value description here>
            \exception?
            \author??wenglj
            \remark??? <br>
            典型用法:?? <br>
            復雜度 :????????????????????????
            *******************************************************************************/
            int _tmain(int argc, _TCHAR* argv[])
            {
            ?CClient?clientObject;

            ?CDictograph?liseners;

            ?CLisener?lisener;

            ?liseners.AddLisener( &lisener );

            ?clientObject.SetLiseners( &liseners ) ;

            ?clientObject.AddObject( 1 );

            ?clientObject.AddObject( 2 );

            ?clientObject.AddObject( 3 );

            ?clientObject.AddObject( 4 );

            ?clientObject.AddObject( 5 );

            ?clientObject.DelObject( 3 );

            ?return 0;
            }



            具體的函數實現解釋都有注釋了。

            posted on 2006-09-23 09:02 傲雪無鵆 閱讀(505) 評論(0)  編輯 收藏 引用

            99久久国产综合精品网成人影院 | 蜜臀久久99精品久久久久久小说| AAA级久久久精品无码片| 亚洲精品tv久久久久久久久 | 久久er99热精品一区二区| 99久久夜色精品国产网站| 久久久久亚洲av无码专区导航 | 久久99精品久久久久久野外| 久久精品国产99久久丝袜| 欧美伊人久久大香线蕉综合| 少妇高潮惨叫久久久久久| 久久精品男人影院| 欧美久久天天综合香蕉伊| 日韩乱码人妻无码中文字幕久久| 久久久久一区二区三区| 久久婷婷成人综合色综合| 午夜精品久久久久成人| 99久久亚洲综合精品成人| 久久久久人妻一区二区三区| 久久亚洲电影| 中文字幕无码久久久| 久久亚洲色一区二区三区| 久久久久久a亚洲欧洲aⅴ| 无码人妻精品一区二区三区久久 | 国产精品18久久久久久vr | 伊人久久免费视频| 精品国产91久久久久久久| 成人免费网站久久久| 久久精品国产亚洲AV麻豆网站 | 久久久久国产一区二区 | 久久久久久久97| 国产精品久久久久国产A级| 日韩欧美亚洲综合久久影院d3| 久久国产乱子精品免费女| 国产农村妇女毛片精品久久| 久久久久这里只有精品 | 香蕉久久一区二区不卡无毒影院| 91精品日韩人妻无码久久不卡 | 久久精品毛片免费观看| Xx性欧美肥妇精品久久久久久| 午夜肉伦伦影院久久精品免费看国产一区二区三区 |