上一篇我們分享了bufferevent | 嵌入式網(wǎng)絡(luò)通信緩沖層,其中bufferevent 采用了 策略模式 設(shè)計(jì),通過 struct bufferevent_ops
實(shí)現(xiàn)多態(tài)行為:
不同類型的 bufferevent(如 socket、filter、SSL)共享同一套接口,通過 be_ops
指針調(diào)用各自的實(shí)現(xiàn)函數(shù)。
這篇文章我們來分享策略模式相關(guān)的內(nèi)容:
策略模式
策略模式(Strategy Pattern)是一種行為設(shè)計(jì)模式,它定義了一系列算法,并將每個(gè)算法封裝成獨(dú)立的對(duì)象,使它們可以相互替換。這種模式讓算法的變化獨(dú)立于使用算法的客戶端。
策略模式包含以下主要角色:
- 上下文(Context):持有一個(gè)策略對(duì)象的引用,用于調(diào)用策略。
- 策略接口(Strategy):定義所有支持的算法或行為的公共接口。
- 具體策略(Concrete Strategies):實(shí)現(xiàn)策略接口的具體類,提供具體的算法實(shí)現(xiàn)。
在嵌入式系統(tǒng)中,該模式尤其適用于:
- 通信協(xié)議切換:在UART/I2C/SPI之間動(dòng)態(tài)切換
- 傳感器數(shù)據(jù)處理:針對(duì)不同傳感器類型(溫度/濕度/光感)使用不同處理策略
- 電源管理:根據(jù)電源狀態(tài)(電池/外接電源)切換功耗策略
- 控制算法:在PID控制、模糊控制等算法間動(dòng)態(tài)切換
策略模式 vs 非策略模式:
嵌入式應(yīng)用案例
傳感器數(shù)據(jù)處理:針對(duì)不同傳感器類型(溫度/濕度)使用不同處理策略。
代碼實(shí)現(xiàn):
1、上下文(Context):
// 傳感器處理器(上下文)
typedef struct {
SensorStrategy strategy;
void* sensor_data;
} SensorProcessor;
2、策略接口(Strategy):
// 策略接口
typedef void (*SensorStrategy)(void* data);
3、具體策略(Concrete Strategies):
// 溫度傳感器策略
void temperature_strategy(void* data) {
float* temp = (float*)data;
printf("[C] Processing temperature: %.1fC -> Calibrated: %.1fC\n",
*temp, *temp + 0.5f);
}
// 濕度傳感器策略
void humidity_strategy(void* data) {
int* humidity = (int*)data;
printf("[C] Processing humidity: %d%% -> Adjusted: %d%%\n",
*humidity, *humidity + 2);
}
C語言完整例子:
#include
// 策略接口
typedef void (*SensorStrategy)(void* data);
// 溫度傳感器策略
void temperature_strategy(void* data) {
float* temp = (float*)data;
printf("[C] Processing temperature: %.1fC -> Calibrated: %.1fC\n",
*temp, *temp + 0.5f);
}
// 濕度傳感器策略
void humidity_strategy(void* data) {
int* humidity = (int*)data;
printf("[C] Processing humidity: %d%% -> Adjusted: %d%%\n",
*humidity, *humidity + 2);
}
// 傳感器處理器(上下文)
typedefstruct {
SensorStrategy strategy;
void* sensor_data;
} SensorProcessor;
void process_sensor(SensorProcessor* processor) {
processor->strategy(processor->sensor_data);
}
int main(void) {
printf("\n--- Strategy Pattern Demo ---\n");
float temp_data = 25.3f;
int humidity_data = 45;
SensorProcessor temp_processor = {temperature_strategy, &temp_data};
SensorProcessor hum_processor = {humidity_strategy, &humidity_data};
process_sensor(&temp_processor);
process_sensor(&hum_processor);
return0;
}
C++完整例子:
#include
#include
// 策略接口
class SensorStrategy {
public:
virtual void process() = 0;
virtual ~SensorStrategy() = default;
};
// 溫度傳感器策略
class TemperatureStrategy :public SensorStrategy {
public:
explicit TemperatureStrategy(float temp) : temp_(temp) {}
void process() override {
std::cout << "Processing temperature: " << temp_
<< "C -> Calibrated: " << temp_ + 0.5f << "C\n";
}
private:
float temp_;
};
// 濕度傳感器策略
class HumidityStrategy :public SensorStrategy {
public:
explicit HumidityStrategy(int humidity) : humidity_(humidity) {}
void process() override {
std::cout << "Processing humidity: " << humidity_
<< "% -> Adjusted: " << humidity_ + 2 << "%\n";
}
private:
int humidity_;
};
// 傳感器處理器(上下文)
class SensorProcessor {
public:
void set_strategy(std::unique_ptr strategy) {
strategy_ = std::move(strategy);
}
void process_sensor() {
if(strategy_) strategy_->process();
}
private:
std::unique_ptr strategy_;
};
int main(void) {
std::cout << "\n--- Strategy Pattern Demo ---\n";
SensorProcessor processor;
processor.set_strategy(std::make_unique(25.3f));
processor.process_sensor();
processor.set_strategy(std::make_unique(45));
processor.process_sensor();
return0;
}
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 開閉原則:無需修改上下文即可引入新策略
- 消除條件分支:替代復(fù)雜的if-else/switch語句
- 關(guān)注點(diǎn)分離:算法實(shí)現(xiàn)與使用邏輯解耦
缺點(diǎn):
- 對(duì)象數(shù)量增加:每個(gè)策略都是獨(dú)立類/對(duì)象
- 客戶端認(rèn)知負(fù)擔(dān):需了解不同策略的差異
- 過度設(shè)計(jì)風(fēng)險(xiǎn):簡(jiǎn)單算法可能不需要策略模式