一.是什么调度器模式算是设计模式中的一种调度器模式 在统一接口之下根据能力位图capabilityBitmap将请求路由到不同的具体实现。本质上是策略模式 路由表的结合策略模式所有子实现提供相同的DiscoveryFuncInterface接口路由表每个子实现注册一个IsConcern谓词调度器遍历路由表找到匹配的实现二、为什么需要BLE 发现不是一种而是6 种业务场景共用 BLE 介质子实现关注的能力业务场景SoftBus BLEcastPlus, dvKit, osd通用分布式发现Share BLEshare跨设备分享Approach BLEapproach靠近发现VLink BLEvirtualLink虚拟链路Touch BLEtouch触碰发现OOP BLEoopOOP 发现问题Manager 层只给 BLE 一个DiscoveryFuncInterface指针BLE 内部怎么区分这 6 种场景答案加一层 Dispatcher根据请求的capabilityBitmap自动路由到对应的子实现。三、核心数据结构DispatcherInterface — 路由表条目从 disc_ble_dispatcher.h:35typedef struct { bool (*IsConcern)(uint32_t capability); // 路由谓词我是否关注这个能力 DiscoveryFuncInterface *mediumInterface; // 具体实现接口 } DiscoveryBleDispatcherInterface;路由表 — Dispatcher 数组#define DISPATCHER_SIZE 6 static DiscoveryBleDispatcherInterface *g_dispatchers[DISPATCHER_SIZE]; // 6个槽位 static uint32_t g_dispatcherSize 0; // 当前注册数每个子实现的 IsConcern子实现IsConcern 实现关注的能力掩码SoftBus BLE(capability g_concernCapabilityMask) ! 013 | 15 | 17(castPlus, dvKit, osd)Share BLEIsShareConcern(capability)18(share)Approach BLEIsApproachConcern(capability)19(approach)VLink BLEreturn false(virtual实现)110(virtualLink)Touch BLEreturn false(virtual实现)111(touch)OOP BLEreturn false(virtual实现)112(oop)注意VLink/Touch/OOP 的 virtual 实现IsConcern返回 false表示当前平台不支持真实实现非 virtual会返回对应的判断。四、调度流程请求到达时的路由过程FindDiscoveryFuncInterface 核心代码static DiscoveryFuncInterface *FindDiscoveryFuncInterface(uint32_t capability) { for (uint32_t i 0; i g_dispatcherSize; i) { if (g_dispatchers[i] NULL) continue; if (g_dispatchers[i]-IsConcern ! NULL g_dispatchers[i]-IsConcern(capability)) { // ★ 路由判断 return g_dispatchers[i]-mediumInterface; // ★ 返回匹配的实现 } } return NULL; // 无匹配返回NULL调用方报错 }五、初始化注册路由表从 disc_ble_dispatcher.c:226DiscoveryFuncInterface *DiscBleInit(DiscInnerCallback *discInnerCb) { g_dispatcherSize 0; // 注册5个基础 Dispatcher g_dispatchers[0] DiscSoftBusBleInit(discInnerCb); // SoftBus BLE (通用) g_dispatchers[1] DiscShareBleInit(discInnerCb); // Share BLE (分享) g_dispatchers[2] DiscApproachBleInit(discInnerCb); // Approach BLE (靠近) g_dispatchers[3] DiscVLinkBleInit(discInnerCb); // VLink BLE (虚拟链路) // 注册扩展 Dispatcher DiscBleInitExt(discInnerCb); // g_dispatchers[4] DiscTouchBleInit(discInnerCb); // Touch BLE (触碰) // g_dispatchers[5] DiscOopBleInit(discInnerCb); // OOP BLE return g_discBleFrameFuncInterface; // 返回统一接口给 Manager }每个DiscXxxBleInit返回一个DiscoveryBleDispatcherInterface包含该子实现的IsConcern和mediumInterface。六、统一接口Dispatcher 对 Manager 透明Dispatcher 向上暴露一个DiscoveryFuncInterfaceManager 完全不知道 Dispatcher 的存在static DiscoveryFuncInterface g_discBleFrameFuncInterface { .Publish BleDispatchStartActivePublish, .StartScan BleDispatchStartPassivePublish, .Unpublish BleDispatchStopActivePublish, .StopScan BleDispatchStopPassivePublish, .StartAdvertise BleDispatchStartActiveDiscovery, .Subscribe BleDispatchStartPassiveDiscovery, .StopAdvertise BleDispatchStopActiveDiscovery, .Unsubscribe BleDispatchStopPassiveDiscovery, .LinkStatusChanged BleDispatchLinkStatusChanged, .UpdateLocalDeviceInfo BleDispatchUpdateLocalDeviceInfo, };每个函数内部都走FindDiscoveryFuncInterface→ 具体实现的路由流程。七、完整结构关系图八、USB Dispatcher — 完全对称的设计USB 发现采用完全相同的调度器模式只是当前只有 1 个 Dispatcher#define DISPATCHER_SIZE 1 static DiscoveryUsbDispatcherInterface *g_usbDispatchers[DISPATCHER_SIZE];路由逻辑与 BLE Dispatcher代码几乎一模一样只是把g_dispatchers换成g_usbDispatchers。九、调度器模式 vs 其他方案方案优点缺点调度器模式当前新增子实现只需注册 Dispatcher不改调度逻辑每次请求遍历路由表 O(N)if-else 硬编码简单直接新增能力必须改调度代码违反开闭原则位图直接映射数组O(1) 查找一个能力只能对应一个实现无法表达SoftBus BLE 关注多种能力虚函数/接口继承面向对象自然分发C 语言没有虚函数需手动实现 vtable当前方案的核心优势IsConcern是谓词而非等值匹配所以 SoftBus BLE 可以一次声明关注 castPlus dvKit osd 三种能力而不需要注册 3 次。这是位图直接映射做不到的。