• <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 傲雪無鵆 閱讀(506) 評論(0)  編輯 收藏 引用

            77777亚洲午夜久久多喷| 久久久久亚洲精品天堂久久久久久| 99久久国产热无码精品免费久久久久| 久久99国产综合精品女同| 精品国产91久久久久久久a| 久久精品国产免费观看三人同眠| 狠狠88综合久久久久综合网| 久久中文娱乐网| 久久人人添人人爽添人人片牛牛| 久久亚洲AV成人无码电影| 久久AAAA片一区二区| 久久精品人人做人人爽电影| 久久九九青青国产精品| 亚洲国产精品无码久久青草| 久久免费观看视频| 久久丫精品国产亚洲av不卡| 久久久久人妻精品一区三寸蜜桃| 国产精品VIDEOSSEX久久发布| 久久AV高清无码| 伊人久久大香线蕉无码麻豆| 久久w5ww成w人免费| 99久久国产亚洲综合精品| 久久精品久久久久观看99水蜜桃 | 国产午夜福利精品久久| 亚洲精品午夜国产va久久| 91久久九九无码成人网站| 漂亮人妻被黑人久久精品| 久久精品免费一区二区| 波多野结衣久久精品| 人妻丰满?V无码久久不卡| 武侠古典久久婷婷狼人伊人| 国内精品久久久久久中文字幕| 久久精品麻豆日日躁夜夜躁| 欧洲人妻丰满av无码久久不卡| 亚洲精品乱码久久久久久| 久久精品国产亚洲精品2020| 欧美黑人激情性久久| 国产美女亚洲精品久久久综合| 亚洲色欲久久久综合网东京热| 久久99国产精品久久99小说| 久久久午夜精品福利内容|