• <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)  編輯 收藏 引用

            久久国产精品-国产精品| 狠狠人妻久久久久久综合蜜桃 | 久久午夜福利无码1000合集| 久久影院午夜理论片无码| 2021国产精品久久精品| 99久久人妻无码精品系列蜜桃| 国产99久久久国产精品~~牛| 久久久久国产| 嫩草伊人久久精品少妇AV| 91精品国产91久久| 伊人久久大香线蕉综合影院首页| 久久久无码精品亚洲日韩按摩 | 欧美激情精品久久久久久久九九九| 中文无码久久精品| 久久黄视频| 国产精品久久久久久久久鸭| 久久这里的只有是精品23| 欧美激情精品久久久久| 亚洲中文字幕无码一久久区| 久久精品中文字幕第23页| 久久99久久99精品免视看动漫| 久久涩综合| 久久久久久久久久免免费精品| 国产精品一久久香蕉国产线看观看 | 亚洲AV乱码久久精品蜜桃| 99久久无色码中文字幕人妻| 国产成人99久久亚洲综合精品| 色综合久久中文字幕无码| 久久精品免费一区二区| 亚洲国产精品成人AV无码久久综合影院 | 久久亚洲私人国产精品vA | 日本欧美国产精品第一页久久| 精品久久久久香蕉网| 精品人妻伦九区久久AAA片69| 欧美成a人片免费看久久| 久久国产高清一区二区三区| aaa级精品久久久国产片| 99久久免费国产精品热| 精品一区二区久久| 国产免费久久久久久无码| 四虎国产精品免费久久久|