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

            來(lái)吧,朋友!

            為C++瘋狂

            設(shè)計(jì)模式解析和實(shí)現(xiàn)(C++) Observer 模式

            作用:

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

            UML結(jié)構(gòu)圖:

             

            解析:

            Observer模式定義的是一種一對(duì)多的關(guān)系,這里的一就是圖中的Subject類,而多則是Obesrver類,當(dāng)Subject類的狀態(tài)發(fā)生變化的時(shí)候通知與之對(duì)應(yīng)的Obesrver類們也去相應(yīng)的更新?tīng)顟B(tài),同時(shí)支持動(dòng)態(tài)的添加和刪除Observer對(duì)象的功能。Obesrver模式的實(shí)現(xiàn)要點(diǎn)是,第一一般subject類都是采用鏈表等容器來(lái)存放Observer對(duì)象,第二抽取出Observer對(duì)象的一些公共的屬性形成Observer基類,而Subject中保存的則是Observer類對(duì)象的指針,這樣就使Subject和具體的Observer實(shí)現(xiàn)了解耦,也就是Subject不需要去關(guān)心到底是哪個(gè)Observer對(duì)放進(jìn)了自己的容器中。生活中有很多例子可以看做是Observer模式的運(yùn)用,比方說(shuō),一個(gè)班有一個(gè)班主任(Subject),他管理手下的一幫學(xué)生(Observer),當(dāng)班里有一些事情發(fā)生需要通知學(xué)生的時(shí)候,班主任要做的不是逐個(gè)學(xué)生挨個(gè)的通知而是把學(xué)生召集起來(lái)一起通知,實(shí)現(xiàn)了班主任和具體學(xué)生的關(guān)系解耦。

            實(shí)現(xiàn):

            1)Observer.h

            /**//********************************************************************
                created:    2006/07/20
                filename:     Observer.h
                author:        李創(chuàng)
                            http://www.shnenglu.com/converse/

                purpose:    Observer模式的演示代碼
            *********************************************************************/

            #ifndef OBSERVER_H
            #define OBSERVER_H

            #include <list>

            typedef int STATE;

            class Observer;

            // Subject抽象基類,只需要知道Observer基類的聲明就可以了
            class Subject
            {
            public:
                Subject() : m_nSubjectState(-1){}
                virtual ~Subject();

                void Notify();                            // 通知對(duì)象改變狀態(tài)
                void Attach(Observer *pObserver);        // 新增對(duì)象
                void Detach(Observer *pObserver);        // 刪除對(duì)象

                // 虛函數(shù),提供默認(rèn)的實(shí)現(xiàn),派生類可以自己實(shí)現(xiàn)來(lái)覆蓋基類的實(shí)現(xiàn)
                virtual void    SetState(STATE nState);    // 設(shè)置狀態(tài)
                virtual STATE    GetState();        // 得到狀態(tài)

            protected:
                STATE m_nSubjectState;                    // 模擬保存Subject狀態(tài)的變量
                std::list<Observer*>    m_ListObserver;    // 保存Observer指針的鏈表
            };

            // Observer抽象基類
            class Observer
            {
            public:
                Observer() : m_nObserverState(-1){}
                virtual ~Observer(){}

                // 純虛函數(shù),各個(gè)派生類可能有不同的實(shí)現(xiàn)
                // 通知Observer狀態(tài)發(fā)生了變化
                virtual void Update(Subject* pSubject) = 0;

            protected:
                STATE m_nObserverState;                    // 模擬保存Observer狀態(tài)的變量
            };

            // ConcreateSubject類,派生在Subject類
            class ConcreateSubject
                : public Subject
            {
            public:
                ConcreateSubject() : Subject(){}
                virtual ~ConcreateSubject(){}

                // 派生類自己實(shí)現(xiàn)來(lái)覆蓋基類的實(shí)現(xiàn)
                virtual void    SetState(STATE nState);    // 設(shè)置狀態(tài)
                virtual STATE    GetState();        // 得到狀態(tài)

            };

            // ConcreateObserver類派生自O(shè)bserver
            class ConcreateObserver
                : public Observer
            {
            public:
                ConcreateObserver() : Observer(){}
                virtual ~ConcreateObserver(){}

                // 虛函數(shù),實(shí)現(xiàn)基類提供的接口
                virtual void Update(Subject* pSubject);
            };

            #endif

             

            2)Observer.cpp

            /**//********************************************************************
                created:    2006/07/20
                filename:     Observer.cpp
                author:        李創(chuàng)
                            http://www.shnenglu.com/converse/

                purpose:    Observer模式的演示代碼
            *********************************************************************/

            #include "Observer.h"
            #include <iostream>
            #include <algorithm>

            /**//* --------------------------------------------------------------------
            |    Subject類成員函數(shù)的實(shí)現(xiàn)
            |
             ----------------------------------------------------------------------*/

            void Subject::Attach(Observer *pObserver)
            {
                std::cout << "Attach an Observern";

                m_ListObserver.push_back(pObserver);
            }

            void Subject::Detach(Observer *pObserver)
            {
                std::list<Observer*>::iterator iter;
                iter = std::find(m_ListObserver.begin(), m_ListObserver.end(), pObserver);

                if (m_ListObserver.end() != iter)
                {
                    m_ListObserver.erase(iter);
                }

                std::cout << "Detach an Observern";
            }

            void Subject::Notify()
            {
                std::cout << "Notify Observers''s Staten";

                std::list<Observer*>::iterator iter1, iter2;

                for (iter1 = m_ListObserver.begin(), iter2 = m_ListObserver.end();
                     iter1 != iter2;
                     ++iter1)
                {
                    (*iter1)->Update(this);
                }
            }

            void Subject::SetState(STATE nState)
            {
                std::cout << "SetState By Subjectn";
                m_nSubjectState = nState;
            }

            STATE Subject::GetState()
            {
                std::cout << "GetState By Subjectn";
                return m_nSubjectState;
            }

            Subject::~Subject()
            {
                std::list<Observer*>::iterator iter1, iter2, temp;

                for (iter1 = m_ListObserver.begin(), iter2 = m_ListObserver.end();
                    iter1 != iter2;
                    )
                {
                    temp = iter1;
                    ++iter1;
                    delete (*temp);
                }

                m_ListObserver.clear();
            }

            /**//* --------------------------------------------------------------------
            |    ConcreateSubject類成員函數(shù)的實(shí)現(xiàn)
            |
            ----------------------------------------------------------------------*/
            void ConcreateSubject::SetState(STATE nState)
            {
                std::cout << "SetState By ConcreateSubjectn";
                m_nSubjectState = nState;
            }

            STATE ConcreateSubject::GetState()
            {
                std::cout << "GetState By ConcreateSubjectn";
                return m_nSubjectState;
            }

            /**//* --------------------------------------------------------------------
            |    ConcreateObserver類成員函數(shù)的實(shí)現(xiàn)
            |
            ----------------------------------------------------------------------*/
            void ConcreateObserver::Update(Subject* pSubject)
            {
                if (NULL == pSubject)
                    return;

                m_nObserverState = pSubject->GetState();

                std::cout << "The ObeserverState is " << m_nObserverState << std::endl;
            }


            3)Main.cpp

            /**//********************************************************************
                created:    2006/07/21
                filename:     Main.cpp
                author:        李創(chuàng)
                            http://www.shnenglu.com/converse/

                purpose:    Observer模式的測(cè)試代碼
            *********************************************************************/

            #include "Observer.h"
            #include <iostream>

            int main()
            {
                Observer *p1 = new ConcreateObserver;
                Observer *p2 = new ConcreateObserver;

                Subject* p = new ConcreateSubject;
                p->Attach(p1);
                p->Attach(p2);
                p->SetState(4);
                p->Notify();

                p->Detach(p1);
                p->SetState(10);
                p->Notify();

                delete p;

                system("pause");

                return 0;
            }

            posted on 2009-07-22 14:44 yanghaibao 閱讀(340) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++開(kāi)發(fā)工具

            導(dǎo)航

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統(tǒng)計(jì)

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            文章檔案

            收藏夾

            Good blogs

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久久国产精品亚洲一区| 国产成人精品久久一区二区三区av| 国产精品日韩欧美久久综合| 日本精品久久久中文字幕| 韩国三级中文字幕hd久久精品| 欧美日韩中文字幕久久久不卡 | 无码精品久久一区二区三区| 久久久国产精品网站| 国产免费久久精品99re丫y| 欧美va久久久噜噜噜久久| 欧美精品一区二区精品久久| 久久影视综合亚洲| 欧美精品一区二区精品久久| 一本久道久久综合狠狠爱| 精品综合久久久久久97超人| 亚洲国产精品成人久久蜜臀 | 人妻丰满?V无码久久不卡| 亚洲国产精品无码久久久不卡| 国産精品久久久久久久| 日产精品99久久久久久| 亚洲va久久久久| 精品久久久久一区二区三区| 国内精品久久久久久久97牛牛| 无码国内精品久久人妻麻豆按摩| 欧美伊香蕉久久综合类网站| 99久久国产精品免费一区二区| 久久精品国产72国产精福利| 国内精品伊人久久久久AV影院| 少妇精品久久久一区二区三区 | 久久婷婷五月综合成人D啪| 久久www免费人成精品香蕉| 久久99国产精品一区二区| 亚洲国产精品久久久天堂| 亚洲午夜精品久久久久久浪潮| 久久久精品国产亚洲成人满18免费网站| 久久精品国产精品亚洲毛片| 日产精品久久久一区二区| 久久精品国产亚洲AV无码偷窥 | 久久久久久A亚洲欧洲AV冫| 国产亚洲成人久久| 久久婷婷五月综合成人D啪|