• <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>
            蝸牛的家
            男兒當(dāng)自強(qiáng)
            posts - 48,  comments - 21,  trackbacks - 0
            意圖:
            定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生變化時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新
            UML圖:

            適用
            當(dāng)一個(gè)抽象模型有兩個(gè)方面,其中一個(gè)方面依賴于另一方面。將這兩者封裝在獨(dú)立的對(duì)象中以使他們可以各自獨(dú)立地改變和復(fù)用
            當(dāng)對(duì)一個(gè)對(duì)象的改變需要同時(shí)改變其他對(duì)象,而不知道具體有多少對(duì)象待改變
            當(dāng)一個(gè)對(duì)象必須通知其他對(duì)象,而他又不能假定其他對(duì)象是誰(shuí)。換言之,你不希望這些對(duì)象是緊密耦合的
            //test.h
            #include <list>

            typedef 
            int STATE;
            using namespace std;
            //////////////////////////////////////////////////////////////////////////
            class 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ì)象
                
                
            virtual void Setstate(STATE nState);
                
            virtual STATE Getstate();
            protected:
                STATE m_nSubjectState;
                list
            <Observer*> m_listObserver;
            }
            ;

            //被更新的類
            class Observer
            {
            public:
                Observer() : m_nObserverState(
            -1){}
                
            virtual ~Observer(){}

                
            virtual void Update(Subject* pSubject) = 0//更新?tīng)顟B(tài)
            protected:
                STATE m_nObserverState;
            }
            ;

            class ConCreateSubject : public Subject
            {
            public:
                ConCreateSubject() : Subject()
            {}
                
            virtual ~ConCreateSubject(){}
                
                
            virtual void SetState(STATE nState);
                
            virtual STATE GetState();
            }
            ;

            class ConCreateObserver : public Observer
            {
            public:
                ConCreateObserver() : Observer()
            {}
                
            virtual ~ConCreateObserver(){}

                
            virtual void Update(Subject* pSubject);
            }
            ;

            // test.cpp : Defines the entry point for the console application.
            //

            #include 
            "stdafx.h"
            #include 
            <iostream>
            #include 
            <algorithm>
            #include 
            "test.h"

            using namespace std;
            //////////////////////////////////////////////////////////////////////////
            void Subject::Attach(Observer *pObserver)
            {
                cout 
            << "Attach an Observer\n";
                m_listObserver.push_back(pObserver);
            }


            void Subject::Detach(Observer *pObserver)
            {
                list
            <Observer*>::iterator iter;
                iter 
            = find(m_listObserver.begin(),m_listObserver.end(),pObserver);
                
            if (m_listObserver.end() != iter)
                
            {
                    m_listObserver.erase(iter);
                }

                cout 
            << "Detach an ObServer\n";
            }


            void Subject::Notify()
            {
                cout 
            << "Notify Observer's state\n";
                list
            <Observer*>::iterator iter1,iter2;
                
            for (iter1 = m_listObserver.begin(),iter2 = m_listObserver.end(); iter1 != iter2; ++iter1)
                
            {
                    (
            *iter1)->Update(this); //更新鏈表中所有對(duì)象的狀態(tài)
                }

            }


            void Subject::Setstate(STATE nState)
            {
                cout 
            << "SetState by Subject \n";
                m_nSubjectState 
            = nState;
            }


            STATE Subject::Getstate()
            {
                cout 
            << "Getstate by Subject\n";
                
            return m_nSubjectState;
            }


            Subject::
            ~Subject()
            {
                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();
            }


            void ConCreateSubject::SetState(STATE nState)
            {
                cout 
            << "Setstate by ConCreateSubject\n";
                m_nSubjectState 
            = nState;
            }


            STATE ConCreateSubject::GetState()
            {
                cout 
            << "Getstate by ConCreateSubject\n";
                
            return m_nSubjectState;
            }


            void ConCreateObserver::Update(Subject* pSubject)
            {
                
            if (NULL == pSubject)
                
            {
                    
            return;
                }

                m_nObserverState 
            = pSubject->Getstate();
                
                cout 
            << "The ObserverState is" << m_nObserverState<< endl;
            }

            //////////////////////////////////////////////////////////////////////////
            int main(int argc, char* argv[])
            {
                Observer 
            *p1 = new ConCreateObserver;
                Observer 
            *p2 = new ConCreateObserver;
                
                Subject 
            *= 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 2008-08-21 23:38 黑色天使 閱讀(813) 評(píng)論(1)  編輯 收藏 引用 所屬分類: 設(shè)計(jì)模式

            FeedBack:
            # re: C++設(shè)計(jì)模式-Observer
            2012-05-09 15:58 | no7dw
            ConCreateSubject::SetState(STATE nState);

            STATE Subject::Setstate()

            has a little typing error ,('S' should not a CAPical letter ) this error leads to ConCreateSubject::SetState NOT a virtual effect  回復(fù)  更多評(píng)論
              

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章檔案

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久九九青青国产精品| 久久免费看黄a级毛片| 99久久久久| 久久精品夜色噜噜亚洲A∨| 欧美一级久久久久久久大| 久久久久久久波多野结衣高潮| 77777亚洲午夜久久多人| 99久久99这里只有免费费精品| 国产福利电影一区二区三区久久久久成人精品综合 | 国产高清美女一级a毛片久久w| 国内精品久久久久国产盗摄| 国产69精品久久久久观看软件| 久久久久高潮毛片免费全部播放 | 91精品国产91久久久久久| 色综合久久中文字幕综合网| 久久精品亚洲中文字幕无码麻豆| 99久久精品费精品国产 | 中文国产成人精品久久不卡| 久久亚洲综合色一区二区三区| 亚洲午夜无码AV毛片久久| AAA级久久久精品无码片| 青青草原综合久久大伊人导航 | 国产成人无码精品久久久性色| 久久精品国产99国产精品澳门| 无码国内精品久久综合88 | 久久久久久伊人高潮影院| 国产一久久香蕉国产线看观看 | 7国产欧美日韩综合天堂中文久久久久 | 91精品国产高清久久久久久io| 开心久久婷婷综合中文字幕| 久久国产色AV免费看| 伊人精品久久久久7777| 亚洲成色999久久网站| 亚洲av伊人久久综合密臀性色| 99久久婷婷国产一区二区| 亚洲精品无码久久千人斩| 欧美午夜A∨大片久久| 精品99久久aaa一级毛片| 国产精品久久久久9999高清| 亚洲狠狠婷婷综合久久蜜芽| 色狠狠久久综合网|