软件设计中的机制与策略分离实现

  第一次看到这句话是在window内核情境分析这一书中,书中描述windows进程调度采用的是机制与策略分离这样一种方式,在windows多任务操作系统中,进程调度算法有轮询,时间片等,这可以看做是进程调度的一种策略,是由windows内核中的进程调度模块实现。windows系统提供从一个进程切换到另一个进程是windows内核提供的一种机制,这种机制包括硬件,数据结构的支撑,是由windows内核中的底层实现。
  优点:
  1.把进程调度划分为两个模块,一个现实进程调度的机制,一个实现进程调度的策略,这样进程调度的可靠性,可扩展性,灵活性更高。
  可靠性:两个模块通过接口进行通信,相互之间是独立的。
  可扩展性:可以添加新的进程调度算法,对原有的实现不会有太大的影响。
  灵活性:两个模块通过接口进行通信,一个模块内部实现的改变,对另一个模块没有影响。
2.机制与策略分离设计方式,使开发软件就更加容易,也更加容易适应不同的需求。

下面是我在项目过程中关于该设计的实践。
背景:
这是一个上位机软件,上位机软件通过串口与嵌入式设备进行通信,上位机软件的应用层通过应用层的协议发送命令原语,嵌入式设备响应该请求原语。
采用机制与策略分离的设计如下:
这里写图片描述
中间大框提供一种机制,该机制让业务层扔一个命令,及这个命令的回调函数给它,该层负责执行,执行完成后调用回调函数,把执行的结果返回给业务层。
业务流程提供一个策略,执行某一个流程,流程可以理解为一个策略,流程是实现某一个业务的算法,
通过这种划分的优点,
1.我们可以更改底层机制的实现,比如在项目的实现过程中,为了测试上位机的流程,而每次与嵌入式设备通信又比较麻烦,特别是在下位机程序还没有写好的情况下,那怎么解决这个问题呢?我们可以写一个下位机模拟器,上位机与嵌入式设备可以不通过串口通信,而是通过TCP通信。这样我们只需改很少的代码。

   //基于RFCOMM蓝牙通信
   /*SOCKADDR_BTH  SockAddrBthServer= RemoteBthAddr;
    SockAddrBthServer.addressFamily = AF_BTH;
    SockAddrBthServer.serviceClassId = g_guidServiceClass;
    SockAddrBthServer.port = 0;
    if (INVALID_SOCKET != LocalSocket)
    {
    closesocket(LocalSocket);
    }
    LocalSocket = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
    if ( INVALID_SOCKET == LocalSocket )
    {
    return status;
    }

    if ( 0 == connect(LocalSocket,
    (struct sockaddr *) &SockAddrBthServer,
    sizeof(SOCKADDR_BTH)) ) 
    {
    status=true;
    }*/
    //基于TCP通信
    //under code is just for test,tcp connect 
    SOCKADDR_IN  HostAddress;
    HostAddress.sin_family=AF_INET;
    HostAddress.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    HostAddress.sin_port=htons(21567);
    if (INVALID_SOCKET != LocalSocket)
    {
        closesocket(LocalSocket);
    }
    LocalSocket = socket(AF_INET, SOCK_STREAM, 0);
    if ( INVALID_SOCKET == LocalSocket )
    {
        return status;
    } 
2.   策略可以不关心底层通信是怎么实现的,只需要要扔一个命令,提供一个如何处理该命令的函数,由这些命令及函数组成各种处理流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值