随笔 - 21  文章 - 0  trackbacks - 0
<2014年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿

随笔分类

随笔档案

文章分类

搜索

  •  

最新评论

阅读排行榜

评论排行榜

observer center有多个subject 事件,observer可以向center同时订阅多个subject事件,

observer center内部维护observer的订阅记录,当subject 事件发生时,通知到订阅了该subject的observers。

#include <iostream>
#include 
<map>

#include 
<boost/thread.hpp>


class subject 
{
public:
    
static const int readsub;
    
static const int writesub;
    
static const int closesub;

    subject()
{ m_sub = 0;}
    
int      m_sub;

    
bool operator < ( const subject &rsub) const
    
{
        
return this->m_sub < rsub.m_sub;
    }


}
;

//bool operator < (const subject &lsub, const subject &rsub)
//{
//    return lsub.m_sub < rsub.m_sub;
//}

 

 

const int subject::readsub = 0;
const int subject::writesub = 1;
const int subject::closesub = 2;

 


class observer
{
public:
    
virtual void update(subject sub)
    
{
        std::cout
<<"observer recv subject update: "<<sub.m_sub<<"\n";    
    }


}
;


class observerAAA:public observer
{
public:
    
virtual void update(subject sub)
    
{
        std::cout
<<"observerAAA recv subject update: "<<sub.m_sub<<"\n";    
    }


}
;


class observerBBB:public observer
{
public:
    
virtual void update(subject sub)
    
{
        std::cout
<<"observerBBB recv subject update: "<<sub.m_sub<<"\n";    
    }


}
;

typedef  boost::shared_ptr
<observer>   SPOBSERVER;

class observerCenter
{
public:

    
void registersubject(subject sub, SPOBSERVER x)
    
{
    
        boost::mutex::scoped_lock   
lock(m_observercentermutex);

        std::map
<subject, LISTobserver>::iterator it = m_observercenter.find(sub);
        
if (it != m_observercenter.end())
        
{
            it
->second.push_back(x);
        }

        
else
        
{
            LISTobserver  lo;
            lo.push_back(x);
            m_observercenter.insert(std::make_pair(sub, lo));
        }

        
    }


    
void update(subject sub)
    
{
        LISTobserver   temp;
        
        
{
            boost::mutex::scoped_lock   
lock(m_observercentermutex);

            std::map
<subject, LISTobserver>::iterator it = m_observercenter.find(sub);
            
if (it != m_observercenter.end())
            
{
                temp 
= it->second;
            }

        }


        LISTobserver::iterator it 
= temp.begin();

        
for (; it != temp.end(); ++it)
        
{
            (
*it)->update(sub);
        }

    

    }

    
void unregistersubject(subject sub, SPOBSERVER x)
    
{
        boost::mutex::scoped_lock   
lock(m_observercentermutex);
        std::map
<subject, LISTobserver>::iterator it = m_observercenter.find(sub);
        
if (it != m_observercenter.end())
        
{
            it
->second.erase(x);
        }

    }



private:

    typedef std::list
<SPOBSERVER> LISTobserver;
    
    boost::mutex                        m_observercentermutex;
    std::map
<subject, LISTobserver>     m_observercenter;

}
;


observerCenter  g_observerCenter;


void eventProduce()
{

    
static int i1 = 0;
    
static int i2 = 0;
    
static int i3 = 0;

    
while (1)
    
{
        
if ((i1++ %1== 0)
        
{
            subject a;
            a.m_sub 
= subject::readsub;
            g_observerCenter.update(a);
        }


        
if ((i2++ %2== 0)
        
{
            subject a;
            a.m_sub 
= subject::writesub;
            g_observerCenter.update(a);
        }


        
if ((i3++ %3== 0)
        
{
            subject a;
            a.m_sub 
= subject::closesub;
            g_observerCenter.update(a);
        }


        boost::this_thread::sleep(boost::posix_time::seconds(
1));
    }



}



void addObserver()
{

    subject a;
    a.m_sub 
= subject::readsub;
    
    subject b;
    b.m_sub 
= subject::writesub;


    subject c;
    c.m_sub 
= subject::closesub;

    
//一个observer可能注册多个subject
    SPOBSERVER   sp(new observerAAA());

    g_observerCenter.registersubject(a, sp);
    g_observerCenter.registersubject(b, sp);
    g_observerCenter.registersubject(c, sp);
    
    SPOBSERVER   sp1(
new observerBBB());

    g_observerCenter.registersubject(a, sp1);
    g_observerCenter.registersubject(b, sp1);

 

    SPOBSERVER   sp2(
new observerAAA());
    g_observerCenter.registersubject(a, sp2);

}



int main()
{

    boost::thread producerthread(boost::bind(eventProduce));


    addObserver();
    boost::this_thread::sleep(boost::posix_time::seconds(
100));

    
}









 

 

 

posted on 2014-07-21 10:21 pizzx 阅读(266) 评论(0)  编辑 收藏 引用 所属分类: c++/boost

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理