请教各位大虾一个关于类设计的问题

xrbeck 2006-10-19 04:50:18
最近碰到个设计上的难点,想听听大家的意见,谢谢。
问题的背景是这样的,以前的开发是用同步的方式,业务层逻辑统一在一个class 比如就叫CBiz好了,聚合了一个CModemSyn的类, 其中modem类是一个核心的功能类,提供了比如modem的一些相关操作(同步方式),这样在CBiz类中,主要就是对modem类进行调用,并且做些相应的业务处理,比如发送套接字提醒等,大概的程序框架代码如下:

CBiz::Recv()
{
PlayVoice();// 1

Bool flag = _modem.recv();

if (flag )
{
ShowInDialog(); //2 SendSocket(); //3
}
Else
{
WriteLog(); //4
}
}
其中1,2,3,4都是CBiz本身的一些方法

现在问题来了。Modem类发生了变化,由同步方式变成了异步方CModemASYN,变成了这种方式:
CmodemASYN::Recv()
{
kernel_call(…, ASYN); // 异步调用
}
CModemASYN::Wait()
{
WaitforEvent();
switch(status)
case connect:
case transmit_begin:
case transmit_over:
}
也就是说在异步的方式下,modem类不能再提供一个同步的recv方法给外面的逻辑层调用,什么时候发送完了只有这个类本身知道,这样的话,要做处理的话,必须在modem类里面以某种回调的方式传出来,比如按照上面的CBIZ的逻辑,必须显示在UI上同时发送套接字,也就是如下的情况:
CModemASYN::Wait()
{
WaitforEvent();
switch(status)
..
..
case transmit_over:
ShowInDialog();// 5
SendSocket(); // 6

}

但是如果出现这样的写法的话,就导致modem类关联了业务层的逻辑,实现了跟自己无关的功能,这样的可扩充性不好,想想消息通知机制里面好像有个observer,但这样的话modem类必须从被观察者派生,似乎不是很合适,另外想到command, 在发送结束的时候关联个command对象,外面的逻辑层实现具体的command, 但好像又有点无从下手的感觉。

想听听各位大侠的意见。看看到底怎么来设计比较优雅一些。
谢谢。
...全文
185 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
onestation 2006-10-19
  • 打赏
  • 举报
回复
用事件类
struct ITestEvent
{
virtual void OnConnect()=0;
};

//CModemASYN.h
ITestEvent *m_pEvent;

//CModemASYN.cpp
CModemASYN::Wait()
{
WaitforEvent();
switch(status)
case connect:
{
if ( NULL != m_pEvent)
m_pEvent->OnConnect();
}
}

//CBiz
class CBiz : public ITestEvent
{
public:
void OnConnect()
{
//实现代码
}
};

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧