C++下,有没好的结合CDialog类来实现的观察者模式实现?听说JAVA下有很成功的例子!VC++下那里有?

解决方案 »

  1.   

    CDIALOG类来实现数据的多种形式表现(饼状图/直方图/表格/坐标曲线),参考GOF的<<设计模式>>下的观察者模式,可以实现观察者模式,但一结合CDIALOG类就不能成功CDIALOG类动态创建的时候老是报"0xC0000005: Access Violation"搞不明白
      

  2.   

    在MFC下没有人做过这样的东西吗?
      

  3.   

    跟模式没关系,你的dialog创建的代码肯定有问题,
      

  4.   

    网上那里可以找到这样的例子?结合了MFC的CDIALOG类来实现的。
      

  5.   

    这样做的好处1》各个界面不要去查询数据的改变,因为数据类会自动通知注册进来的观察者(界面/CDIALOG类)
    2》使用CDIALOG类就继承了MFC里面各种表现功能,不需要我们自己去实现那些复杂的画点/线/面的功能
    3》动态创建观察者(界面/CDIALOG类),动态注册与取消注册,程序结构简单好编程
      

  6.   

    VC++下结合Dialog的就没有了,这里贴一份别人做的C++版本吧。
     
     /********************************************************************
    created: 2006/07/21
    filename:  Main.cpp
    author: 李创
                    http://www.cppblog.com/converse/ purpose: Observer模式的测试代码
    *********************************************************************/#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;
    }/********************************************************************
    created: 2006/07/20
    filename:  Observer.cpp
    author: 李创
                    http://www.cppblog.com/converse/ purpose: Observer模式的演示代码
    *********************************************************************/#include "Observer.h"
    #include <iostream>
    #include <algorithm>/* --------------------------------------------------------------------
    | Subject类成员函数的实现
    |
     ----------------------------------------------------------------------*/void Subject::Attach(Observer *pObserver)
    {
    std::cout << "Attach an Observer\n"; 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 Observer\n";
    }void Subject::Notify()
    {
    std::cout << "Notify Observers's State\n"; 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 Subject\n";
    m_nSubjectState = nState;
    }STATE Subject::GetState()
    {
    std::cout << "GetState By Subject\n";
    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类成员函数的实现
    |
    ----------------------------------------------------------------------*/
    void ConcreateSubject::SetState(STATE nState)
    {
    std::cout << "SetState By ConcreateSubject\n";
    m_nSubjectState = nState;
    }STATE ConcreateSubject::GetState()
    {
    std::cout << "GetState By ConcreateSubject\n";
    return m_nSubjectState;
    }/* --------------------------------------------------------------------
    | ConcreateObserver类成员函数的实现
    |
    ----------------------------------------------------------------------*/
    void ConcreateObserver::Update(Subject* pSubject)
    {
    if (NULL == pSubject)
    return; m_nObserverState = pSubject->GetState(); std::cout << "The ObeserverState is " << m_nObserverState << std::endl;
    }/********************************************************************
    created: 2006/07/20
    filename:  Observer.h
    author: 李创
                    http://www.cppblog.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(); // 通知对象改变状态
    void Attach(Observer *pObserver); // 新增对象
    void Detach(Observer *pObserver); // 删除对象 // 虚函数,提供默认的实现,派生类可以自己实现来覆盖基类的实现
    virtual void SetState(STATE nState); // 设置状态
    virtual STATE GetState(); // 得到状态protected:
    STATE m_nSubjectState; // 模拟保存Subject状态的变量
    std::list<Observer*> m_ListObserver; // 保存Observer指针的链表
    };// Observer抽象基类
    class Observer
    {
    public:
    Observer() : m_nObserverState(-1){}
    virtual ~Observer(){} // 纯虚函数,各个派生类可能有不同的实现
    // 通知Observer状态发生了变化
    virtual void Update(Subject* pSubject) = 0;protected:
    STATE m_nObserverState; // 模拟保存Observer状态的变量
    };// ConcreateSubject类,派生在Subject类
    class ConcreateSubject
    : public Subject
    {
    public:
    ConcreateSubject() : Subject(){}
    virtual ~ConcreateSubject(){} // 派生类自己实现来覆盖基类的实现
    virtual void SetState(STATE nState); // 设置状态
    virtual STATE GetState(); // 得到状态};// ConcreateObserver类派生自Observer
    class ConcreateObserver
    : public Observer
    {
    public:
    ConcreateObserver() : Observer(){}
    virtual ~ConcreateObserver(){} // 虚函数,实现基类提供的接口
    virtual void Update(Subject* pSubject);
    };#endif
      

  7.   

    class  CDetailObserver:public CObserver,public CDialog 

      CDetailObserver( ); 
      virtual ~CDetailObserver( ); 

    这样继承的,怎么加对话框资源?怎么动态new并用DoModal来显示(不使用Create来创建窗体)
      

  8.   

    设计基类、派生类、子派生类,定义子派生类的对象,观察参数的传递顺序http://blog.csdn.net/livelylittlefish/archive/2008/03/11/2171195.aspx