C++下,有没好的结合CDialog类来实现的观察者模式实现?听说JAVA下有很成功的例子!VC++下那里有? C++下,有没好的结合CDialog类来实现的观察者模式实现?听说JAVA下有很成功的例子!VC++下那里有? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CDIALOG类来实现数据的多种形式表现(饼状图/直方图/表格/坐标曲线),参考GOF的<<设计模式>>下的观察者模式,可以实现观察者模式,但一结合CDIALOG类就不能成功CDIALOG类动态创建的时候老是报"0xC0000005: Access Violation"搞不明白 在MFC下没有人做过这样的东西吗? 跟模式没关系,你的dialog创建的代码肯定有问题, 网上那里可以找到这样的例子?结合了MFC的CDIALOG类来实现的。 这样做的好处1》各个界面不要去查询数据的改变,因为数据类会自动通知注册进来的观察者(界面/CDIALOG类)2》使用CDIALOG类就继承了MFC里面各种表现功能,不需要我们自己去实现那些复杂的画点/线/面的功能3》动态创建观察者(界面/CDIALOG类),动态注册与取消注册,程序结构简单好编程 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类派生自Observerclass ConcreateObserver : public Observer{public: ConcreateObserver() : Observer(){} virtual ~ConcreateObserver(){} // 虚函数,实现基类提供的接口 virtual void Update(Subject* pSubject);};#endif class CDetailObserver:public CObserver,public CDialog { CDetailObserver( ); virtual ~CDetailObserver( ); } 这样继承的,怎么加对话框资源?怎么动态new并用DoModal来显示(不使用Create来创建窗体) 设计基类、派生类、子派生类,定义子派生类的对象,观察参数的传递顺序http://blog.csdn.net/livelylittlefish/archive/2008/03/11/2171195.aspx 图像处理 界面按钮功能如何实现,大家帮我,新人 我看见一个程序,它的一个类继承了cwinthread,又重载了run,他是在创建用户接口线程吗?但他没有建AfxBeginThread,请问run是怎么调用的 扫描体造型的算法或文档 一个关于动态连接库的问题。(非常感谢) 对于recv这种阻塞函数,大家是如何避免出现收不到数据而无响应的? 关于注册表 如何用最简洁的方法保存ActiveX控件(OCX)的属性?? 在线等待! 有谁作过用udp传输文件的? 求电子白板的简单问题 一个图片或者图片按钮?在线等。。。
2》使用CDIALOG类就继承了MFC里面各种表现功能,不需要我们自己去实现那些复杂的画点/线/面的功能
3》动态创建观察者(界面/CDIALOG类),动态注册与取消注册,程序结构简单好编程
/********************************************************************
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
{
CDetailObserver( );
virtual ~CDetailObserver( );
}
这样继承的,怎么加对话框资源?怎么动态new并用DoModal来显示(不使用Create来创建窗体)