第一次看到这句话是在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. 策略可以不关心底层通信是怎么实现的,只需要要扔一个命令,提供一个如何处理该命令的函数,由这些命令及函数组成各种处理流程。