同步转为异步的OO解决之道

        同步和异步是完全两种不同的形式, 由于调用的方式不一样,导致了程序的写法不一样,写法不一样,自然就影响到了整个软件框架的设计。在这里给出一种可行的方法,在基本不影响到框架的情况下,进行软件的改造。

       问题的背景是这样的,以前的开发是用同步的方式,业务层逻辑统一在一个class 比如就叫CBiz好了,聚合了一个CModemSyn的类,   其中modem类是一个核心的功能类,提供了比如modem的一些相关操作(同步方式),这样在CBiz类中,主要就是对modem类进行调用,并且做些相应的业务处理,比如发送套接字提醒等,大概的程序框架代码如下:

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

Bool flag = _modem.recv();  // 2

if (flag )
{
ShowInDialog();  //2

SendSocket();     //3
}
Else
{
WriteLog();      //4
}
}
其中1,2,3,4都是CBiz本身的一些方法,意思也非常简单,成功的话展现数据并发送套接字,失败则记录LOG

其结构如下:

 现在问题来了。Modem类发生了变化,由同步方式变成了异步方CModemASYN,变成了这种方式:
CmodemASYN::Recv()
{
kernel_call(…, ASYN); //   异步调用
}
CModemASYN::Wait()
{
 status = 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类关联了业务层的逻辑,实现了跟自己无关的功能,这样的可扩充性不好, 这里,我们就需要一个接口的出现:

IModemEvent

{

    virtual void OnConnect() = 0;

   virtual  void OnTransmit() = 0;

}

为了隔离业务层与事件接口,我们再设计一个Adapter

class CModemEventAdapter : public IModemEvent

{

public:

      void Init(CBiz * biz) {_biz = biz;}

     void OnConnect() {_biz->SendSocket();}

     void OnTransmit(_biz->WriteLog();)

};

这样我们就实现了一个比较完整的良好的OO设计,在不影响现有的基础上,实现了同步到异步的改造

 

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

xrbeck

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值